为什么C中允许使用此代码?
int x;
int main() {
printf("%d\n", x);
return 0;
}
int x = 2;
使用-Wall -std=c89
同时使用gcc
和clang
进行编译时不会发出警告。
我之前认为全球范围内的int x
等同于int x = 0
。我发现自己很惊讶。
答案 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;
无效。
在没有声明之前使用或不允许使用定义