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再次定义?那为什么不是多重定义错误呢?
定义始终是一个声明.不同之处在于定义也给出了声明某些值的任何内容.
在你的榜样,顺便说一下,它是唯一一个重新声明错误:
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都是函数的局部变量.