#include<stdio.h>
int x=13; // forcing space allocation
int x;
int main(){
printf("%d\n",x);
}
上面的代码编译但下面的代码没有编译。为什么?
#include<stdio.h>
int main(){
int x=13; // forcing space allocation
int x;
printf("%d\n",x);
}
我被告知int x;可以由编译器将其解释为声明或定义,具体取决于上下文。我可以在第一种情况下看到(全局一种),但在第二种情况下会发生什么。
答案 0 :(得分:4)
C程序中不能有两个具有相同名称的全局变量。 C 可能允许在同一文件范围内的多个定义 tentative definition rule,但无论如何都会引用所有定义 到同一个变量。
答案 1 :(得分:0)
因为您不能声明两次具有相同名称的局部变量。不要那样做。
它适用于全局的,因为编译器将其视为forward declaration,当然它不能用于堆栈变量。
请注意,只有在没有分配值时,它才能全局工作。
答案 2 :(得分:0)
继续发表评论:“请你详细说明前瞻性声明”......
前向声明正是他们听起来的样子。将在其他地方(通常是后来)定义的声明。该概念仅适用于全局符号。在结果二进制文件中只能有一个全局符号的定义。但是,您可以在源代码中反复声明它们,以便在编译阶段可以引用它们。
这些符号在汇编中成为定义,然后用于在链接阶段将所有内容链接在一起。
头文件是在代码中其他地方(稍后)定义的前向声明的常用示例。
本地(自动)变量不会转换为符号。所以当你说出像
这样的话int x;
int x;
在同一范围内,编译器不允许它,因为它是无意义的。局部变量只是指向函数堆栈帧中特定位置的便利。它们的定义边界在范围标记{
}
内。
头文件本质上是全局变量和函数的“前向声明”;在struct foo;
中查看此内容。
如果您希望看到全局定义导致错误,请尝试。 int x = 10;
int x = 11;
作为全局,你会看到编译器向“redifintion of x”效果吐出错误。