重新申报错误

6 c c++ declaration definition

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

f(int a,int b)
{
     int a;
     a=20;
     return a; 
}
Run Code Online (Sandbox Code Playgroud)

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

  • f(int a,int b)- 这里a定义对了吗?
  • 并在函数体中,int a再次定义?

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

Min*_*s97 7

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

在你的榜样,顺便说一下,它唯一一个重新声明错误:

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

你可能打算这样做:

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

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

错误:'a'重新声明为另一种符号

那是因为a最初被定义为一个参数,它与函数范围内的变量定义不同.由于编译器发现你重新声明了与你的新声明不同的"品种"的东西,如果你的非法声明是一个定义,它可以不在乎,因为它在术语上对"定义"的看法不同函数参数和函数局部变量.

但是,如果你这样做:

int c = 20;
int c = 20;
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,我喜欢你的答案,如果我错了,这就是我理解的纠正我,所以你说的是函数参数的声明与局部变量的声明不同所以我们得到这个错误就像在这种情况下一样extern int a; 和extern char a; 有不同类型的声明 (2认同)