3

我是 C++ 的新手。我不明白为什么可以将 1 个函数声明两次(即为什么编译器允许这样做)。例如,以下代码是合法的:

#include <iostream>
#include <string>

int hello();
int hello();

int main(){
    cout << "hello, world" << endl;
}

int hello(){
    return 1;
}

为什么编译器不抱怨?

4

2 回答 2

1

在 C 和 C++ 中,前向声明非常弱。它们向编译器提供了一个正式的“承诺”,即如果出现具有指定签名的函数,它将具有您指定的签名。该函数甚至不能保证出现:除非您调用或以其他方式引用声明的函数,否则编译器不会抱怨有一个没有定义的声明。该标准要求编译器将相同的前向声明视为单个声明。

与根据单一定义规则必须唯一的定义不同

3.2 任何翻译单元不得包含任何变量、函数、类类型、枚举类型或模板的多个定义

声明只需要引用相同的定义,即彼此等价:

3.3.4 给定同一声明区域中的一组声明,每个声明都指定相同的非限定名称,它们都应指代同一实体,或都指代函数或函数模板,

于 2013-05-20T03:31:10.200 回答
0

“一个定义规则”将消除您的疑问。它在 ISO C++ 标准 (ISO/IEC 14882) 2003 第 3.2 节中定义。

它指出:

在任何翻译单元中,模板、类型、函数或对象只能有一个定义。其中一些可以有任意数量的声明。

在 Wikipedia ( http://en.wikipedia.org/wiki/One_Definition_Rule )上阅读更多相关信息

于 2013-05-20T03:28:02.883 回答