两个具有相同名称和类型的变量,在两个不同的.c文件中,使用gcc编译

joh*_*dka 11 c static gcc extern

这是交易.我在两个不同的.c文件中有两个相同的全局变量,它们没有被声明为extern.所以每个.c文件都应该看到自己的变量,对吧?

但是我得到了一些非常奇怪的行为,好像一个文件正在读取其他文件变量(将它们链接在一起之后).将"静态"限定符添加到两个变量定义似乎解决了这个问题.

所以我真正想知道的是,在没有'静态'限定符的情况下究竟发生了什么?

cni*_*tar 18

所以每个.c文件都应该看到自己的变量,对吧?

错误.在C中,省略static声明意味着隐式extern链接.

来自C in a Nutshell:

编译器在没有存储类说明符的情况下处理函数声明,就像它们包含说明符extern一样.同样,您在所有函数外部声明且没有存储类说明符的任何对象标识符都具有external linkage.

  • 仅供参考,Visual Studio 2008和GCC 4.3.5都遵循此规则.并使用c ++编译器重新编译代码(通过在VC中更改为.cpp扩展名,或在linux下调用g ++)会产生"多重定义"链接错误. (2认同)