重新申报错误

时间:2015-02-16 05:00:34

标签: c++ c declaration definition

我理解了声明和定义之间的区别 当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出代码段中的错误。

f(int a,int b)
{
     int a;
     a=20;
     return a; 
}

为什么这会给a的重新声明错误? 不应该给出a的多重定义,因为在:

  • f(int a,int b) - 此处a定义正确吗?
  • 并且在函数体中,再次定义了int a

那么为什么不能出现多重定义错误?

2 个答案:

答案 0 :(得分:6)

定义始终是声明。不同之处在于定义也给出了你声明某些值的任何内容。

在您的示例中,顺便说一下,重新声明错误:

f(int a, /* Defines a */
int b)
{
     int a; /* Declares a - error! */
     a=20; /* initializes a */
     return a; 
}

您可能打算这样做:

f(int a, /* Defines a */
int b)
{
     int a = 20; /* Declares and defines a - error! */
     return a; 
}

但在这种情况下,大多数编译器都会抛出重新声明"错误也是。例如,GCC抛出以下错误:

  

错误:' a'重新宣布为另一种符号

这是因为a最初定义为参数,它与函数范围内的变量定义不同。由于编译器发现您已经重新声明某些不同的东西"品种"如果你的非法声明是一个定义,它不会比你的新声明更少关心,因为它关注"定义"在函数参数和函数局部变量方面有所不同。

但是,如果你这样做:

int c = 20;
int c = 20;
例如,

GCC 会抛出重定义错误,因为c - s都是函数的局部变量。

答案 1 :(得分:1)

在代码中声明变量时,将根据声明中使用的数据类型为该变量名分配一个内存块。

但是当你尝试重新声明同一个变量时,处理器会尝试分配已经分配了相同名称的内存。因为当尝试访问具有该变量名称的内存块时处理器面临歧义,编译器不允许该指令,因此多个声明将不被允许,您将在GCC编译器中收到错误,

line 3 col 10    [Error]redeclaration of 'int a'
line 1 col 7     [Error]'int a' previously declared here

代码

  f(int a,int b)    //first declaration of 'a'
  {
       int a;       //redeclaration of 'a', whose memory is already allocated
       a=20;
       return a; 
  }

的 在内存布局上,两个块不能具有相同的标识(变量名),因此编译器会抛出重新声明错误,因为当变量' a'被重新宣布。