1

我正在阅读有关内部和外部链接的信息,我发现默认情况下,函数具有外部链接。

所以我在想是否可以在头文件管理器中声明一个函数并在不同的翻译单元中提供它的多个定义。

到目前为止,我确实在头文件中声明了一个函数

void fct();

并在两个文件中提供 2 个定义,每个文件都包含在一个匿名命名空间中:

namespace
{
    void fct()
    {    
    }    
}

但是我没有看到这如何成为在不同 TU 中使用函数的多个定义的好例子。

有人可以给我看一个简单的例子(甚至使用内联)谢谢

4

1 回答 1

3

我可以在不同的 TU 中提供相同的函数定义吗

如果函数没有内联声明,则否;这将违反单一定义规则。

可以在多个 TU 中定义具有外部链接的内联函数 - 附加要求定义必须相同。事实上,内联声明将强制要求在所有使用该函数的 TU 中提供定义。

并在两个文件中提供 2 个定义,每个文件都包含在一个匿名命名空间中:

这并不违反标准规则。这两个函数不一样,也不和 global 一样::fct

但是我没有看到这如何成为在不同 TU 中使用函数的多个定义的好例子。

有人可以给我看一个简单的例子(甚至使用内联)谢谢

干得好:

// header.hpp
inline void foo() {}

// a.cpp
#include "header.hpp"

// b.cpp
#include "header.hpp"

这里有两个 TU,每个都包含 function 的定义::foo,包含在同一个标​​头中。这是允许的,因为该函数是内联声明的。


相关标准报价(当前草案,我编辑的无关细节):

单定义规则 [basic.def.odr]

一个 ... 函数,... 不应在先前的定义必须可达的情况下定义([module.reach]);如果先前声明在另一个翻译单元中,则不需要诊断。

...

每个程序都应包含在该程序中被丢弃的语句之外的每个非内联函数或变量的确切定义;无需诊断。...内联函数或变量的定义应可在每个翻译单元中访问,在该翻译单元中,在丢弃的语句之外使用它。

...

在程序中可以有多个定义...具有外部链接 ([dcl.inline]) ... 的内联函数...前提是在某个点处没有必然可以访问先前的定义 ([module.reach])出现定义,并提供定义满足以下要求。... 不需要诊断,除非在稍后的定义出现时可以达到先前的定义。给定这样一个名为 D 的实体在多个翻译单元中定义,则

  • D 的每个定义应由相同的记号序列组成;和
  • ~ 其他限制的冗长列表 ~
于 2019-06-11T17:24:53.283 回答