错误:没有链接的重新声明

#include int x=13; // forcing space allocation int x; int main(){ printf("%d\n",x); } 

上面的代码编译但下面的代码没有编译。 为什么?

 #include int main(){ int x=13; // forcing space allocation int x; printf("%d\n",x); } 

我被告知int x; 可以由编译器将其解释为声明或定义,具体取决于上下文。 我可以在第一种情况下看到(全局一种),但在第二种情况下会发生什么。

引用:

在C程序中,不能有两个具有相同名称的全局变量。 C可能允许通过暂定定义规则在同一文件范围中进行多个定义,但无论如何所有定义都将引用相同的变量。

因为您不能声明两次具有相同名称的局部变量。 根本不要那样做。

它适用于全局的,因为编译器将其视为前向声明 ,当然这不能用于堆栈变量。

请注意,只有在未分配值时,它才能全局工作。

继续你的评论:“你能详细说明前瞻性声明”……

前向声明正是他们听起来的样子。 将在其他地方(通常是稍后)定义的声明。 此概念仅适用于全局符号。 在结果二进制文件中只能有一个全局符号的定义。 但是,您可以在源代码中反复声明它们,以便在编译阶段可以引用它们。

这些符号在汇编中成为定义,然后用于在链接阶段将所有内容链接在一起。

头文件是在代码中其他地方(稍后)定义的前向声明的常用示例。

本地(自动)变量不会转换为符号。 所以,当你说出类似的话

 int x; int x; 

在相同的范围内,编译器不允许它,因为它是无意义的。 局部变量只是指向函数堆栈帧中特定位置的便利。 它们的定义边界在范围标记{ }

头文件本质上是全局变量和函数的“前向声明”; 在struct foo;为你看这个struct foo;

如果您希望看到全局定义导致错误,请尝试。 int x = 10; int x = 11; 作为一个全局,你会看到编译器向“redifintion of x”效果吐出一个错误。