IAR编译出现“xxxxxxxx" declared implicity”

来源:互联网 发布:c语言判断时间间隔 编辑:程序博客网 时间:2024/04/30 06:38

在使用IAR编译C程序时出现function "xxxxxxx" declared implicity,说明在使用此函数之前没有对它声明,是隐式声明。

显示声明和隐式声明:

以BASIC为例

  隐式和显式声明
  默认情况下,Visual Basic 编译器强制使用“显式声明”,它要求在使用每个变量前先声明变量。可以去掉此要求并允许“隐式声明”。Visual Basic 提供了一个控制显式声明的开关。如果关闭此开关,则不用声明变量就可以使用变量。

  可以用以下任何方法将显式声明开关设置为打开或关闭:

  在集成开发环境 (IDE) 的“属性”窗口中设置合适的项目属性
  指定 /optionexplicit 命令行编译器选项
  将 Option Explicit 语句包含在代码的开头
  如果使用 Option Explicit 语句,设置将重写项目属性和编译器选项设置,但只针对该语句所在的源代码文件。

  将 Option Explicit 设置为 On 具有强制在编译时(而不是在运行时)进行类型推理的优点。这将提高性能。

  隐式声明
  如果关闭显式声明,则可以隐式声明变量,只需在代码中使用它即可。所有隐式声明的变量都具有 Object 数据类型。但是,如果显式声明所有变量并使用特定的数据类型,则应用程序的效率会更高。这将减少命名冲突错误和拼写错误的发生。它也允许编译器检测潜在的运行时错误,如将 Integer 赋给 Short。

  可以写一个不声明局部变量函数,如下例所示:

  Function SafeSqrt(Num)
  TempVal = Math.Abs(Num) ' Make sure value is positive for square root.
  Return Math.Sqrt(TempVal)
  End Function
  Visual Basic 自动将 TempVal 创建为一个局部变量,可以像显式声明了该变量一样使用它。虽然这样很方便,但如果拼错了变量名,可能会在代码中导致细微的错误。假设在前面的示例中写了如下函数:

  Function SafeSqrt(Num)
  TempVal = Math.Abs(Num) ' Make sure value is positive for square root.
  Return Math.Sqrt(TemVal)
  End Function
  此代码初看上去与原来的一样。但它拼错了 Sqrt 的参数 TempVal 变量,因此编译器将另外创建一个称为 TemVal 的局部变量,它不会被赋值,并且函数将总是返回零。

  Visual Basic 遇到新名称时,它无法确定您是要隐式声明新变量还是仅仅拼错了现有变量,因此它用该名称创建一个新变量。另一种可能是,编译器可能已经定义了该名称,而代码将在不自觉中使用该定义。

  通过使用显式声明可以避免由拼错变量名引起的问题。

  显式声明
  如果显式声明对前面的示例中包含 SafeSqrt 函数的模块有效,则 Visual Basic 会将 TempVal 和 TemVal 识别为未声明的变量,并对它们都生成错误。因此,应将 TempVal 显式地声明如下:

  Function SafeSqrt(Num As Single) As Single
  Dim TempVal As Single = Math.Abs(Num)
  Return Math.Sqrt(TemVal)
  End Function
  通过这个修订过的代码,您会立即了解问题所在,因为 Visual Basic 会针对拼错的 TemVal 显示一条错误信息。鉴于显式声明有助于捕捉这些类型的错误,建议在所有代码中使用显式声明。

  注意 Option Explicit 语句基于每个文件进行操作。该语句必须位于每个想用来控制显式变量声明的执行的源代码文件的开头。

阅读全文
1 0