【发布时间】:2021-12-24 06:33:03
【问题描述】:
我发现了这个问题,C 中的同一个静态变量在同一范围内被声明了两次,但代码中没有编译错误。这是怎么回事?
#include<stdio.h>
static int i = 90;
int main(){
printf("%d", i);
return 0;
}
static int i;
【问题讨论】:
-
为了好玩,尝试在第二行添加一个初始化器......
-
第一个是定义。第二个是暂定定义。 Here's a similar question 有更多关于暂定定义的信息。长话短说,存在与旧(1989 年之前)编译器向后兼容的暂定定义,不应在新代码中使用。
-
仅供参考,请注意标题中的“全局范围”,C 没有全局范围(在整个程序中可见)。这些声明是 external(在任何函数之外),带有 internal links 和 file scope(在翻译单元的其余部分可见)。具有外部链接的标识符可以在多个翻译单元中使用,但这与全局范围不同,因为它需要在每个单元中声明并且通过链接而不是范围来实现。
-
除非询问语言之间的差异或交互,否则不要同时标记 C 和 C++。选择一个标签并删除另一个。