我知道C中的全局变量有时会有extern关键字.什么是extern变量?宣言是什么样的?它的范围是什么?
这与跨源文件共享变量有关,但这是如何工作的?我在哪里用extern?
为什么以下不会出错?
for (int i=0; i<10; ++i) // outer loop
{
for (int i=0; i<10;++i) // inner loop
{
//...do something
}
//...do something else
}
Run Code Online (Sandbox Code Playgroud)
我理解它的方式,大括号({...})中的变量只在这些大括号内.但是内环在外环的支撑内.因此,一旦我声明int i=0内部循环,我不应该得到有关多个定义的错误吗?
int a;
int a=3; //error as cpp compiled with clang++-7 compiler but not as C compiled with clang-7;
int main() {
}
Run Code Online (Sandbox Code Playgroud)
对于 C,编译器似乎将这些符号合并为一个全局符号,但对于 C++,这是一个错误。
文件 1:
int a = 2;
Run Code Online (Sandbox Code Playgroud)
文件2:
#include<stdio.h>
int a;
int main() {
printf("%d", a); //2
}
Run Code Online (Sandbox Code Playgroud)
作为用 clang-7 编译的 C 文件,链接器不会产生错误,我假设它将未初始化的全局符号“a”转换为外部符号(将其视为被编译为外部声明)。作为使用 clang++-7 编译的 C++ 文件,链接器会产生多重定义错误。
更新:链接的问题确实回答了我的问题中的第一个示例,特别是“在 C 中,如果在同一翻译单元中较早或较晚找到实际的外部定义,则暂定定义仅作为声明。” 和'C++ 没有“暂定定义”'。
至于第二种情况,如果我 printf a,那么它会打印 2,所以显然链接器已经正确链接了它(但我以前假设编译器将临时定义初始化为 0 作为全局定义,并且会导致链接错误)。
事实证明,int i[];两个文件中的暂定定义也与一个定义相关联。int i[5];也是 .common 中的一个暂定定义,只是向汇编器表达了不同的大小。前者称为类型不完整的暂定定义,而后者是类型完整的暂定定义。
C 编译器发生的情况是,int a在 .common 中将其设为强绑定弱全局,并在符号表中 …
参考下面的代码:
#include <stdio.h>
int a;
int a;
int main()
{
int b;
int b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器(GCC)仅仅为变量'b'而不是'a'抱怨重新声明?
redef.c:在函数'main'中:redef.c:19:错误:重新声明没有链接的'b'
redef.c:18:错误:之前的'b'声明就在这里
c ×4
c++ ×2
c++-faq ×1
clang ×1
clang++ ×1
declaration ×1
definition ×1
extern ×1
scoping ×1
terminology ×1