C中同名的外部变量和全局变量
我想弄清楚,如果在某些程序中,我们会有这样的结果:C中同名的外部变量和全局变量,c,global,external,extern,C,Global,External,Extern,我想弄清楚,如果在某些程序中,我们会有这样的结果: extern int x; void foo(){...} void bar(){...} void main(){ foo(); bar(); } int x=0; 那么假设会发生什么呢?为什么允许有两个同名的变量?它们不同吗?“extern”的意思是:“这个变量将来自其他地方。这里没有声明它;这个语句只是提供了一个有效名称的通知。” 因此,本质上,该代码是: extern int x; // This is a valid name,
extern int x;
void foo(){...}
void bar(){...}
void main(){
foo();
bar();
}
int x=0;
那么假设会发生什么呢?为什么允许有两个同名的变量?它们不同吗?“extern”的意思是:“这个变量将来自其他地方。这里没有声明它;这个语句只是提供了一个有效名称的通知。” 因此,本质上,该代码是:
extern int x;
// This is a valid name, but the variable will be defined "externally", eg, somewhere else.
[...]
int x=0;
// OH! Here is where the definition is. Now we know where that "extern" variable came from.
// And we know that it starts with value 0.
和extern
和定义出现在同一个文件中有些不寻常
更典型的是,定义位于一个.C
文件中,而外部
位于另一个.C
文件中,该文件将在构建过程中链接在一起。它们不是“两个”变量。它们是一样的
是x
的声明
及
提供x
的定义。这是完全正确的
您可以有多个声明,如:
extern int x;
extern int x;
它也会编译
注意:当您为同一标识符提供多个声明时,规则有些复杂。有关详细信息,请参阅。
请参阅以获取示例。非常好。
这个
仅声明int类型的变量x,extern明确表示它将在另一个位置定义
在您的情况下,下面几行
int x = 0;
以下是有关extern的更多信息的链接->
外部说明符只允许在变量声明中使用
和函数(类成员或函数参数除外)。信息技术
指定外部链接,在技术上不影响存储
持续时间,但不能用于自动
存储持续时间对象,因此所有外部对象都具有静态或线程
持续时间此外,使用extern和
没有初始值设定项不是定义
更典型的是,
extern
在头文件中尝试编译:intx;int x;int x=3;外部INTX代码>。即使为GCC设置了非常繁琐的选项,它也可以编译。将extern
行移到顶部,然后clang-Weverything
接受它。前两个intx代码>是暂定定义。intx=3代码>是一个非暂定(确定?)定义。你不能重复,也不能使用不同的初始值设定项。如果文件末尾没有明确的定义,则intx代码>将转换为一个。在文件作用域中声明的变量(没有存储类说明符)与明确声明的extern
具有相同的存储类和链接。也就是说,你称之为“外部”的变量和你称之为“全局”的变量之间没有区别。然而,extern
的存在或不存在会在其他方面产生影响。
extern int x;
extern int x;
extern int x;
int x = 0;