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