Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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规则中的extern关键字_C_Extern - Fatal编程技术网

C规则中的extern关键字

C规则中的extern关键字,c,extern,C,Extern,为什么下面的代码可以工作- extern int i; main() { int i = 10; printf("%d", i); } 但这一个不- main() { extern int i; int i = 10; printf("%d", i); } 因为extern意味着变量是在别处定义的。您可以在其他地方从全局范围定义变量(因为它是全局的,所以它是共享的:),但不能在其他地方定义局部变量,因为函数体就在这里。如果您可以在两个文件之间将函数体一分

为什么下面的代码可以工作-

extern int i;    
main()
{
   int i = 10;
   printf("%d", i);
}
但这一个不-

main()
{
   extern int i;
   int i = 10;
   printf("%d", i);
}

因为
extern
意味着变量是在别处定义的。您可以在其他地方从全局范围定义变量(因为它是全局的,所以它是共享的:),但不能在其他地方定义局部变量,因为函数体就在这里。如果您可以在两个文件之间将函数体一分为二,在一个块中声明此变量,然后在另一个块中使用
extern
引用它,那么这就有点道理了。。。但这是不可能的,因此函数体内部的
extern
是没有意义的


UPD:对不起,我没有注意到在这两种情况下都有两个变量@linuxfan的答案在这种情况下更适用。我将把这个答案留在这里,以防它对任何人都有帮助(作为额外的细节)。

如评论中所述,在第一个片段中有两个不同的变量;作用域规则使局部(内部)变量隐藏外部变量,但仍有两个


在第二个片段中,有一种诱人的做法,即两次声明相同的标识符,并且声明会相互冲突。

在第一个片段中。您正在声明全局变量“i”存在,并且已在项目中其他位置包含的某个文件中的其他位置声明

主文件中的其他函数将能够访问该变量。主文件中的main函数创建了一个同名的局部变量,因此将无法访问全局“i”变量

第二个片段有两个错误。 1) 您正在尝试声明局部外部变量-这是无效的。
2) 您试图用相同的名称向同一范围内的变量声明。

在第一种情况下,有2个
i
变量,一个本地变量和一个全局变量。您不能在本地范围内使用
extern
。要点是:你想要实现什么。错误的思维:C语言是由一个规范(读取)定义的,而不是由你计算机上特定编译器的行为定义的。害怕这里未定义的行为在哪里?我不想为别人的评论接受优点。旁边:我没有提到
extern
,因为我想使用一个局部作用域的extern变量;它可能有意义。@linuxfan,如果你愿意,我可以删除更新的这一部分。只是个人意见。至于
extern
,我还是不同意。因为在这种情况下,就好像您在声明一个局部变量,但是使用
extern
关键字。这会引起混乱,没有任何问题。但对于extern:它不会引起混淆,因为extern是声明的,您可以阅读它。考虑一个静态局部变量——你接受它吗?这是一个全球性的,但具有局部范围。为什么静态是,外部否?@linuxfan,因为
static
extern
不是全局的<代码>静态属于函数,属于函数所有,其他人无法修改它(当然,除非您将指向它的引用/指针显式传递给外部世界)。从语义上讲,它不是全局的,只是持久的<代码>外部,则不同。好吧,这可能是一个感知的问题:)除了这个答案,我还想建议你阅读另一个StackOverflow问题来正确使用它。我已经做了很多错误修复,
extern
被错误使用。这是一个严重的“危险”关键词。