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
被错误使用。这是一个严重的“危险”关键词。