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