下面的代码为什么起作用-
extern int i;
main()
{
int i = 10;
printf("%d", i);
}
但是这不是-
main()
{
extern int i;
int i = 10;
printf("%d", i);
}
答案 0 :(得分:4)
正如评论中已经提到的,在第一个片段中有两个不同的变量;范围规则使局部(内部)变量隐藏外部变量,但仍然有两个变量。
在第二个片段中,有两次声明相同标识符的诱惑,并且声明彼此冲突。
答案 1 :(得分:1)
因为extern
表示该变量在其他位置定义。您可以在其他地方从全局范围定义变量(好吧,因为它是全局的,所以它是共享的:)),但是您不能在其他地方定义局部变量,因为函数体就在这里。如果您能以某种方式在两个文件之间将函数主体拆分为两个,则在一个块中声明此变量,然后使用extern
在另一个块中引用该变量,这将很有意义。但是,这是不可能的,因此函数体内的extern
是没有意义的。
UPD :抱歉,这两种情况都没有两个变量。在这种情况下,@ linuxfan的答案会更好。我将在此处保留此答案,以防万一对其他人有帮助(作为其他详细信息)。
答案 2 :(得分:1)
在您的第一个片段中。您声明的是全局变量'i'存在,并且已在项目中其他位置的某些文件中的其他位置声明。
主文件中的其他函数将能够访问该变量。主文件中的main函数会创建一个具有相同名称的局部变量,因此将无法访问全局'i'变量。
第二个片段有两个错误。 1)您正在尝试声明局部extern变量-这是无效的。 2)您尝试声明具有相同名称的相同作用域中的变量。