IAR编译出现“xxxxxxxx" declared implicity”
2017-09-04 14:32
337 查看
在使用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 语句基于每个文件进行操作。该语句必须位于每个想用来控制显式变量声明的执行的源代码文件的开头。
显示声明和隐式声明:
以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 语句基于每个文件进行操作。该语句必须位于每个想用来控制显式变量声明的执行的源代码文件的开头。
相关文章推荐
- IAR编译zigbee出现问题Undefined external "?V1" referred in AF
- IAR编译出现Error[e46]: Undefined external "_NOP" referred in main
- 编译模块出现WARNING: "xxxx" [xxxx.ko] undefined!的警告
- 在使用IAR编译出现no definition for "__VECTOR_TABLE" __VECTOR_RAM" "__BOOT_STACK_ADDRESS"
- 在使用IAR编译出现no definition for "__VECTOR_TABLE" __VECTOR_RAM" "__BOOT_STACK_ADDRESS"
- c++求教:我在linux下用CodeLite编译调试时出现&"warning: GDB: Failed to set controlling terminal: Operation not permitted/n"
- iOS:编译时出现"no such file or directory:xxx"以及"use twice...filenames are used to distinguish private dec
- javac 编译源文件出现"java:1: 需要为 class、interface 或 enum"、" [javac] 锘縫"错误
- "xxxx".zip:这个压缩文件格式未知或者数据已经被损坏,打不开压缩文件,总出现这个提示的解决方法
- VS2005例子中编译时出现"已跳过生成: 项目", 不编译, 也不报错
- MDK中编译出现warning: function "xxx" declared implicitly 警告的解决办法
- 出现"若要针对 .NET Framework 4.0 或更高版本进行编译,则提供程序选项中“compilerVersion”特性的值必须为“v4.0”或更高版本。……"错误
- 关于java文件编译后,同一个文件出现"$"的class
- gcc g++编译时警告:"xxxx" 将随后被初始化_解决方法
- 编译apprtc 出现如下错误 File "./build/build_app_engine_package.py"
- IAR的一个编译错误Error[e27]: Entry "GenericApp_Init::?relay" in module Coordinator
- 用gcc编译.cpp文件可能出现"undefined reference to `__gxx_personality_v0'"问题的解决
- intellij idea 代码正常,但是编译出现 java:需要";"
- ubuntu16.04编译内核出现 "mkimage" command not found - U-Boot images will not be built
- IAR调试出现the stack plug-in failed to set a breakpoint on "main"