重新声明错误
Redeclaration Error
我明白了声明和定义的区别
当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出片段中的错误。
f(int a,int b)
{
int a;
a=20;
return a;
}
为什么会出现 a
的重新声明错误?
它不应该给出 a
的多重定义,因为在:
f(int a,int b)
— 这里 a
定义正确吗?
- 并且在函数体中,又定义了
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;
}
但在这种情况下,大多数编译器也会抛出 "redeclaration" 错误。例如,GCC 抛出以下错误:
Error: 'a' redeclared as a different kind of symbol
那是因为a
最初定义为参数,不同于函数作用域内的变量定义。当编译器发现您 重新声明 与您的新声明 "breed" 不同的东西时,如果您的非法声明是一个定义,它就不会在意或者不是,因为它在函数参数和函数局部变量方面对 "definition" 的看法不同。
但是,如果您这样做:
int c = 20;
int c = 20;
例如,GCC 会抛出 redefinition 错误,因为两个 c
-s 都是函数的局部变量。
当您在代码中声明一个变量时,将根据声明中使用的数据类型为该变量名分配一块内存。
但是当您尝试重新声明同一个变量时,处理器会尝试分配已经分配了相同 name.so 的内存,因为处理器在尝试访问具有该变量名称的内存块时会面临歧义编译器不允许该指令,因此 多个声明 将不被允许,您将在 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' 被重新声明时,编译器会抛出一个重新声明错误,因为不可能进行多次声明。
我明白了声明和定义的区别 当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出片段中的错误。
f(int a,int b)
{
int a;
a=20;
return a;
}
为什么会出现 a
的重新声明错误?
它不应该给出 a
的多重定义,因为在:
f(int a,int b)
— 这里a
定义正确吗?- 并且在函数体中,又定义了
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;
}
但在这种情况下,大多数编译器也会抛出 "redeclaration" 错误。例如,GCC 抛出以下错误:
Error: 'a' redeclared as a different kind of symbol
那是因为a
最初定义为参数,不同于函数作用域内的变量定义。当编译器发现您 重新声明 与您的新声明 "breed" 不同的东西时,如果您的非法声明是一个定义,它就不会在意或者不是,因为它在函数参数和函数局部变量方面对 "definition" 的看法不同。
但是,如果您这样做:
int c = 20;
int c = 20;
例如,GCC 会抛出 redefinition 错误,因为两个 c
-s 都是函数的局部变量。
当您在代码中声明一个变量时,将根据声明中使用的数据类型为该变量名分配一块内存。
但是当您尝试重新声明同一个变量时,处理器会尝试分配已经分配了相同 name.so 的内存,因为处理器在尝试访问具有该变量名称的内存块时会面临歧义编译器不允许该指令,因此 多个声明 将不被允许,您将在 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' 被重新声明时,编译器会抛出一个重新声明错误,因为不可能进行多次声明。