这是一个理论问题: 假设我有2个源文件/编译单元,A.c和B.c
A.C:
int x;
B.c:
int x;
变量x被认为是在对象之间共享。也就是说,分配了一个int 在某个地方,这个变量是全局的,并且对于声明它的所有源文件都是可见的。
但是我也可以这样做: B.c:
extern int x;
在这种情况下,extern和plain全局变量之间有什么区别吗? 一般来说有什么区别?
谢谢!
答案 0 :(得分:2)
如果x
中有A.c
的一个定义,x
中有B.c
的一个定义,则您的程序会调用未定义的行为。
某些工具链会通过在某些特定情况下定义未定义的行为来接受您的程序,但您不能依赖于所有编译器。
C99,6.9p5)“如果在表达式中使用通过外部链接声明的标识符(除了作为sizeof运算符的操作数的一部分,其结果是整数常量),整个程序中的某个地方应该准确标识符的一个外部定义;否则,不应超过一个“
答案 1 :(得分:1)
不同之处在于它不会在没有extern
的情况下链接,您将获得多重定义错误。只有extern
的版本才有效。