我是C ++的新手。我不明白为什么它是好的(即为什么编译器允许它)1个函数被声明两次。例如,以下代码是合法的:
#include <iostream>
#include <string>
int hello();
int hello();
int main(){
cout << "hello, world" << endl;
}
int hello(){
return 1;
}
为什么编译器不抱怨?
答案 0 :(得分:1)
在C和C ++中,前向声明非常弱。它们为编译器提供了一个正式的“承诺”,即如果具有指定签名的函数出现,它将具有您指定的签名。甚至不保证该函数出现:除非您调用或以其他方式引用声明的函数,否则编译器不会抱怨没有定义的声明。该标准要求编制者将相同的前向声明视为单一声明。
与根据单一定义规则必须唯一的定义不同
3.2任何翻译单元不得包含任何变量,函数,类类型,枚举类型或模板的多个定义
声明仅需要引用相同的定义,即相互等同:
3.3.4给定同一声明区域中的一组声明,每个声明指定相同的非限定名称,它们都应引用同一实体,或者全部引用函数或函数模板,[...] < / p>
答案 1 :(得分:0)
您的疑问将被“一个定义规则”清除。它在ISO C ++标准(ISO / IEC 14882)2003中的3.2节中定义。
它声明:
上阅读更多相关信息在任何翻译单元中,模板,类型,功能或对象都可以 只有一个定义。其中一些可以有任意数量 声明。