我已经理解声明和定义之间的区别
当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出代码片段中的错误。
f(int a,int b)
{
int a;
a=20;
return a;
}
为什么这会给出重新声明错误a
?
它不应该给出多重定义吗a
因为在:
-
f(int a,int b)
— here a
定义对吗?
- 在函数体中,
int a
又被定义了?
那么为什么不会出现多重定义错误呢?
定义始终是声明。不同之处在于,定义还为您声明的任何内容提供了一些值。
顺便说一下,在你的例子中,它is只有重新声明错误:
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 是函数的局部变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)