C全局共享变量vs外部变量

C globally shared variable vs extern variable

本问题已经有最佳答案,请猛点这里访问。

这是一个理论问题:假设我有两个源文件/编译单元,A.C和B.C

A.c:

1
int x;

B.c:

1
int x;

变量x被认为是在对象之间共享的。也就是说,分配了一个int这个变量是全局变量,对声明它的所有源文件都可见。

但是我也可以这样做:B.c:

1
extern int x;

在这个上下文中,外部变量和普通全局变量有什么区别吗?一般来说有什么区别?

谢谢!!


如果您在A.c中有一个x的定义,在B.c中有一个x的定义,那么您的程序将调用未定义的行为。

有些工具链通过在某些特定情况下定义未定义的行为来接受您的程序,但是您不能对所有编译器都依赖这一点。

C99, 6.9p5)"If an identifier declared with external linkage is used in an expression (other than as part of the operand of a sizeof operator whose result is an integer constant), somewhere in the entire program there shall be exactly one external definition for the identifier; otherwise, there shall be no more than one"


不同的是,如果没有extern,它将无法链接,您将得到一个多定义错误。只有带extern的版本才有效。