我是C++的新手。我不明白为什么它可以(也就是为什么编译器允许它)为一个函数声明两次。例如,下面的代码是合法的:C++函数声明
#include <iostream>
#include <string>
int hello();
int hello();
int main(){
cout << "hello, world" << endl;
}
int hello(){
return 1;
}
为什么编译器不会抱怨?
我是C++的新手。我不明白为什么它可以(也就是为什么编译器允许它)为一个函数声明两次。例如,下面的代码是合法的:C++函数声明
#include <iostream>
#include <string>
int hello();
int hello();
int main(){
cout << "hello, world" << endl;
}
int hello(){
return 1;
}
为什么编译器不会抱怨?
在C和C++向前声明是非常弱的。它们为编译器提供了一个正式的“承诺”,即如果具有指定签名的函数完全出现,它将拥有您指定的签名。该函数甚至不能保证出现:除非您调用或以其他方式引用声明的函数,否则编译器不会抱怨没有定义的声明。该标准要求编译器将相同的前向声明视为单个声明。
不像必须根据单一的定义规则
的多个定义是唯一的定义3.2无翻译单元应包含任何变量,函数,类型,枚举类型,或模板
声明仅仅需要来指代相同的定义,即,是彼此相等:
3.3.4给定一组的decla口粮在相同的陈述区域,每一个都指定相同的非限定名称,它们应该都指同一个实体,或者全部指的是功能或功能模板,[...]
您的疑问将被“一个定义规则”清除。它在ISO C++标准(ISO/IEC 14882)2003中的3.2节中定义。
它指出:
在任何翻译单元,模板,类型,功能,或者对象可以 具有不超过一个定义的更多。其中一些可以有任何数量的 声明。
了解更多关于它的维基百科(http://en.wikipedia.org/wiki/One_Definition_Rule)
它可以被声明为许多只要你想要的时间。否则,不同的标题不能很好地结合在一起。 – chris