10

在下面的代码中,为什么多个声明(和一个定义)对全局变量有效x,但对函数y内部的局部变量无效main()?它显示以下 2 个错误:

1) 重新声明 'y' 没有链接

2) 之前的 'y' 声明在这里

为什么它显示局部变量而不是全局变量的错误?不仅是我的书,而且来自这个论坛的以下 2 个链接清楚地表明我们可以多次声明一个变量(尽管只定义一次)。

链接1 链接 2

请注意解释第一个错误“没有链接的'y'的重新声明”的“没有链接”部分是什么意思?什么联系以及与谁联系?局部变量将链接到哪里?

    #include<stdio.h>

    int x;
    int x;
    int x=303;

    int main(void)
    {

      int y;
      int y;
      int y=776;   //Works fine if above 2 declarations are removed!!

      printf("The value of x is %d,and of y is %d",x,y);

    }
4

3 回答 3

22

在 C 和 C++ 中,int y; 函数内既是声明又是定义。

在 C 中,int x;文件范围内(在任何函数之外)是声明和暂定定义。允许多个暂定定义;只允许一个定义

于 2013-03-31T21:34:17.603 回答
5

这是 C99 标准第 6.2.2 节第 2 部分中定义的方式:

在构成整个程序的一组翻译单元和库中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。在一个翻译单元中,带有内部链接的标识符的每个声明都表示相同的对象或函数。没有链接的标识符的每个声明都表示一个唯一的实体。

“全局”变量x具有外部链接,因此它们表示同一个对象。y另一方面,局部变量没有链接,因此存在冲突。

参考文献:C99 标准

于 2013-03-31T21:34:32.317 回答
4

对于外部变量,任何不是初始化的声明都是暂定定义。这些本身不会创建任何存储,因此允许多个存储。以你为例:

int x;      // tentative def
int x;      // and again -- ok
int x=303;  // definition -- ok
int x=303;  // multiple definition -- error

如果在文件末尾只有暂定定义,则变量定义一次,并设置为 0。

这意味着如果您链接到另一个也具有 的暂定定义的文件,x根据标准,您将遇到错误。但是,大多数编译器/链接器始终允许这样做,并且在标准中将其定义为扩展。

对于局部变量,由于范围规则,每个声明都是一个定义。但是,这是允许的:

void func(void)
{
   int y = 0;
   {
      int y = 1;   // a completely different y
   }
}
于 2013-03-31T21:57:28.077 回答