【发布时间】:2019-10-26 04:12:05
【问题描述】:
我正在阅读有关内部和外部链接的信息,我发现默认情况下,函数具有外部链接。
所以我在想是否可以在头文件管理器中声明一个函数并在不同的翻译单元中提供它的多个定义。
到目前为止,我确实在头文件中声明了一个函数
void fct();
并在两个文件中提供 2 个定义,每个文件都包含在一个匿名命名空间中:
namespace
{
void fct()
{
}
}
但我不明白这怎么能成为在不同 TU 中使用函数的多个定义的好例子。
谁能给我看一个简单的例子(即使使用内联) 谢谢
【问题讨论】:
-
匿名命名空间中的定义与头文件中的声明不匹配。你到底想达到什么目标?
-
我想要实现的是在两个不同的翻译单元中编写一个函数的 2 个定义(甚至相同)。我读到内联函数是一个可能有多个定义的函数(但它们必须相同)。
-
@Blood-HaZaRd - 这仅适用于内联函数。您可能没有多个非内联函数的定义。如果成功,您将收到链接器错误。如果您没有收到链接器错误,则说明您没有成功。
-
您最好稍微扩展一下 Pimpl idiom 来实现这一点。
-
@Blood-HaZaRd - 匿名命名空间可以被认为是一个命名空间,其名称对于每个翻译单元都是唯一的。函数的名称包括声明它的命名空间。因此,每个位于匿名命名空间但位于不同翻译单元中的两个函数具有不同的名称,即使声明中的函数名称看起来相同。
标签: c++ linkage one-definition-rule translation-unit