重新申报错误

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

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

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

  • f(int a,int b) – 这里定义了吗?
  • 在函数体中, int a被定义了吗?

那么为什么不是多重定义错误?

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

在你的例子中,顺便说一下,它只是一个重新声明错误:

 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都是函数的局部变量。

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

但是当你尝试重新声明同一个变量时,处理器会尝试分配已经分配了相同名称的内存。因为当尝试访问具有该变量名称的内存块时处理器面临歧义,编译器不允许该指令,因此不允许多个声明 ,你会在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’时,编译器会抛出重新声明错误,因为多个声明是不可能的。