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

时间:2011-11-14 16:25:37

标签: c

#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;可以由编译器将其解释为声明或定义,具体取决于上下文。我可以在第一种情况下看到(全局一种),但在第二种情况下会发生什么。

3 个答案:

答案 0 :(得分:4)

Quoting:

  

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”效果吐出错误。

相关问题