为什么gcc为局部变量提供未使用变量的错误而不为全局变量提供错误?

时间:2009-03-19 23:14:45

标签: gcc global local

我对gcc有疑问。为什么我在函数中本地定义变量时会得到未使用变量的错误,但是当变量在唯一文件中是全局变量时却没有?

我可以理解它可以用于其他人,但为了做到这一点,我需要把外部词放在正确的位置?

提前致谢。

7 个答案:

答案 0 :(得分:6)

编译器无法知道是否使用了全局变量 - 例如,可以使用以完全不同的语言编写的编译单元来使用它。

答案 1 :(得分:3)

因为全局变量可以在编译器无法知道的任何其他地方使用。例如,在外部库o程序上。

答案 2 :(得分:3)

编译器可以确定未使用的本地。未使用的全局变量只能由链接器确定,因为它们可以跨目标文件共享。

通常,链接器不会对代码进行警告。

答案 3 :(得分:3)

如果通过“唯一文件中的全局”,你的意思是任何函数之外的"int x;",那么检测它不是编译器工作,如果另一个编译单元需要,变量需要可供链接器使用它(如errno)。

如果您认为"static int x"链接器无法使用它,这可能只是GCC做出的选择。我不相信编译器必需来通知这一点,除了在你的地址空间浪费几个字节之外它没有任何真正的损害。

答案 4 :(得分:2)

当变量是全局变量时,编译器对项目中的所有编译单元都没有完全可见性 - 变量可以在另一个编译单元中修改。链接器能够告诉它未使用,可能会将其从目标文件中删除。

答案 5 :(得分:1)

因为如果它是全局的,它可以被稍后链接的另一个模块使用。

将所有全局变量定义在单个文件中是一种常见的习惯用法。该文件甚至可能没有任何代码,更不用说使用所有变量的代码了。

答案 6 :(得分:1)

当我在android2.3中构建dalvikVM时遇到了同样的问题,我得到了关键点。这是因为编译器的参数太严格了:

LOCAL_CFLAGS + = - 错误