这是交易。我在两个不同的.c文件中有两个相同的全局变量,它们没有被声明为extern。所以每个.c文件都应该看到自己的变量,对吗?
但是我得到了一些非常奇怪的行为,好像一个文件正在读取其他文件变量(将它们链接在一起之后)。将“静态”限定符添加到两个变量定义似乎解决了这个问题。
所以我真正想知道的是,在没有'静态'限定符的情况下究竟发生了什么?
答案 0 :(得分:18)
所以每个.c文件应该看到自己的变量,对吗?
错误。在C中,从声明中省略static
意味着隐式extern
链接。
来自C in a Nutshell:
编译器在没有存储类的情况下处理函数声明 说明符,好像它们包含说明符extern。同样,任何 您在所有函数外部声明的对象标识符 存储类说明符具有
external linkage
。
答案 1 :(得分:4)
总是初始化全局变量,然后编译器不会自动将其链接视为extern。编译器将在编译期间抛出错误。
这将有助于避免大代码库中的随机问题,因为我们的代码可能会使用其他声明的具有某些随机值的变量(在我们的逻辑视角中)
答案 2 :(得分:1)
输出文件是通过制作单独文件的目标文件然后通过链接器将它们链接在一起而生成的。现在当你在两个不同的文件中有相同的变量时,单个文件将编译而没有错误,但是在链接时链接器将得到两个变量定义并生成错误。但是如果两个变量的静态范围限制为文件,那么每个东西都可以正常工作。 我希望你会发现这很有用。
答案 3 :(得分:0)
据我所知,当你既没有指定static也没有指定extern时,由编译器来决定。在这种情况下,gcc适用于extern,因此您必须在您的情况下指定静态。
几年前我遇到了同样的问题: - )