当我创建一个单独的块(新的花括号)时,在main()函数内部,就像这样 - :
int main(void){
int x = 10;
{
extern int y;
printf("\tNo. is %d\n", y);
int y = 20;
}
}
编译此代码时遇到错误:
test.c: In function ‘main’:
test.c:12:9: error: declaration of ‘y’ with no linkage follows extern declaration
int y = 20;
test.c:9:16: note: previous declaration of ‘y’ was here
extern int y;
但是
如果int y的定义位于main函数的末尾,则代码编译并运行完全正常。
这个错误背后的原因是什么?根据我的书,如果变量被声明为extern,那么我们可以在定义它之前使用它,编译器将在整个文件中搜索变量的定义。
答案 0 :(得分:0)
在具有相同块范围的块中,不能两次声明具有相同名称的变量。
答案 1 :(得分:0)
C区分文件范围中的变量(=任何函数外部的变量)和本地范围中的变量。
y
- 您使用extern
声明并在printf
中使用的变量是指文件范围中的变量。该变量仅被声明,必须在其他地方“定义”。那就是必须为它分配存储空间。
如果你在任何y
内有{}
的第二个声明,那么这是一个与文件范围变量不同的局部变量。如果它在外面,则它是文件范围变量的声明和该文件范围变量的“暂定定义”。所以在后面这种情况下,你有一个声明,在使用变量的地方是可见的,在其他地方有一个定义,提供存储,一切正常。
答案 2 :(得分:0)
是的,当你在那里使用extern时有问题。这意味着此int在同一文件或不同文件中全局定义。但是没有定义y(全局),你打印的是外部值,这就是链接器错误的原因