我正在阅读有关内部和外部链接的信息,我发现默认情况下一个函数具有外部链接。
所以我在想是否可以在标头文件管理器中声明一个函数,并在不同的转换单元中提供它的多个定义。
到目前为止,我确实在头文件中声明了一个功能
void fct();
,并在两个文件中提供2个定义,每个定义包含在一个匿名名称空间中:
namespace
{
void fct()
{
}
}
但是我没有看到在不同的TU中使用函数的多个定义怎么可能是一个很好的例子。
有人可以给我看一个简单的例子(甚至使用内联) 谢谢
答案 0 :(得分:3)
我可以在不同的TU中提供相同的功能定义吗
如果函数未声明为内联,则为否;会违反一个定义规则。
具有外部链接的内联函数可以在多个TU中定义-附加要求其定义必须相同。实际上,内联声明将强制在所有使用该函数的TU中提供定义。
,并在两个文件中提供2个定义,每个定义包含在一个匿名名称空间中:
这不违反标准规则。这两个功能不相同,也不与全局::fct
相同。
但是我没有看到在不同的TU中使用函数的多个定义怎么可能是一个很好的例子。
有人可以告诉我一个简单的例子(即使使用内联)谢谢
您在这里:
// header.hpp
inline void foo() {}
// a.cpp
#include "header.hpp"
// b.cpp
#include "header.hpp"
这里有两个TU,每个TU包含功能::foo
的定义,该定义包含在同一标头中。之所以允许这样做是因为该函数是内联声明的。
相关标准报价(当前草稿,无关的细节由我编辑):
一个定义规则[basic.def.odr]
一个...函数,...不应在必须达到先前定义的情况下定义([module.reach]);如果先前的声明在另一个翻译单元中,则无需诊断。
...
每个程序应在被丢弃的语句之外,确切地包含该程序中奇特使用的每个非内联函数或变量的一个定义;无需诊断。 ...内联函数或变量的定义应在每个被丢弃的语句之外使用的转换单元中都可以到达。
...
在程序中,具有外部链接的内联函数([dcl.inline])...可以有多个定义,只要在该处没有必然的先入定义([module.reach])。定义出现的位置,并提供满足以下要求的定义。 ...除非在出现后续定义时可以达到先前的定义,否则不需要诊断。 给定这样一个名为D的实体,它在多个翻译单元中定义,则
- D的每个定义都应包含相同的令牌序列;和
- 〜其他限制的清单〜