我理解了声明和定义之间的区别 当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出代码段中的错误。
f(int a,int b)
{
int a;
a=20;
return a;
}
为什么这会给a
的重新声明错误?
不应该给出a
的多重定义,因为在:
f(int a,int b)
- 此处a
定义正确吗?int a
?那么为什么不能出现多重定义错误?
答案 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'被重新宣布。