【发布时间】:2009-03-19 23:14:45
【问题描述】:
我有一个关于 gcc 的问题。为什么当我在函数中本地定义变量时出现未使用变量的错误,而当变量在唯一文件中是全局变量时却没有?
我可以理解它可以用于其他人,但要做到这一点,我需要把外部词正确吗?
提前致谢。
【问题讨论】:
我有一个关于 gcc 的问题。为什么当我在函数中本地定义变量时出现未使用变量的错误,而当变量在唯一文件中是全局变量时却没有?
我可以理解它可以用于其他人,但要做到这一点,我需要把外部词正确吗?
提前致谢。
【问题讨论】:
编译器无法知道是否使用了全局变量 - 例如,它可以从用完全不同的语言编写的编译单元中使用。
【讨论】:
如果“全局在一个唯一文件中”,你的意思是 "int x;" 在任何函数之外,编译器的工作不是检测到,如果另一个编译单元需要它,该变量需要对链接器可用(比如errno)。
如果您的意思是 "static int x" 链接器无法使用它,这可能只是 GCC 做出的选择。我不认为编译器需要通知这一点,除了在您的地址空间中浪费几个字节之外,它并没有真正的损害。
【讨论】:
因为全局变量可以用在编译器不知道的任何其他地方。例如在外部库或程序上。
【讨论】:
未使用的局部变量可以由编译器确定。未使用的全局变量只能由链接器确定,因为它们可以跨对象文件共享。
一般来说,链接器不会对代码生成发出警告。
【讨论】:
当变量是全局变量时,编译器无法完全了解项目中的所有编译单元 - 变量可以在另一个编译单元中修改。链接器能够判断它未使用,可能会将其从目标文件中删除。
【讨论】:
因为如果它是全局的,它可以被稍后链接的另一个模块使用。
将所有全局变量定义在一个文件中是一种常见的习惯用法。该文件甚至可能没有任何代码,更不用说使用所有变量的代码了。
【讨论】:
我在android2.3中构建dalvikVM时遇到了同样的问题,我得到了重点。是因为编译器的参数太严格了:
LOCAL_CFLAGS += -Werror。
【讨论】: