C中允许重新声明全局变量?

时间:2016-10-16 20:24:55

标签: c variables storage global declaration

为什么C中允许使用此代码?

int x;

int main() {
    printf("%d\n", x);
    return 0;
}

int x = 2;

使用-Wall -std=c89同时使用gccclang进行编译时不会发出警告。

我之前认为全球范围内的int x等同于int x = 0。我发现自己很惊讶。

2 个答案:

答案 0 :(得分:1)

int x;,在文件范围内,是暂定定义并由@PSkocik回答,如果不存在初始化定义,则行为类似于int x = 0;

  

我之前认为全球范围内的int x等同于int x = 0

关于“全局”int x;的棘手部分假设它是用0初始化的。如果任何编译单元中不存在另一个int x = constant;,则初始化为0 。

因此,当对象需要初始化时,建议显式初始化并且不将默认初始化计数为0位。

// Does an initialization exist, in some file -maybe?
int x;
// Better.  If another file initializes `x`, good to see a compiler/linker error.
int x = 0;

答案 1 :(得分:-2)

EXPLAIN

是宣言。

ORDER BY

是一个定义(也是一个声明)。

只要声明兼容(相同),就允许重新声明。

int x;

会工作吗?不允许重新定义

int x = 2;

无效。
在没有声明之前使用或不允许使用定义