Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中同名的外部变量和全局变量_C_Global_External_Extern - Fatal编程技术网

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;