我明白了声明和定义的区别 当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出片段中的错误。
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;
}
但在这种情况下,大多数编译器也会抛出“重新声明”错误。例如,GCC 抛出以下错误:
Error: 'a' redeclared as a different kind of symbol
那是因为a
最初被定义为参数,不同于函数作用域内的变量定义。当编译器看到您正在重新声明与您的新声明属于不同“品种”的东西时,它不会在意您的非法声明是否是定义,因为它在函数参数和函数局部变量方面对“定义”的看法不同。
但是,如果您这样做:
int c = 20;
int c = 20;
例如,GCC 会抛出一个重定义 错误,因为两个 c
-s 都是函数的局部变量。
关于c++ - 重新声明错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28534809/