匿名命名空间包含两个cpp文件中的函数

时间:2013-11-06 15:31:08

标签: c++

我有一个函数应该包含在一个公共头文件中的两个不同的翻译单元(即cpp文件)中。

我可能会使用匿名命名空间将这个功能包含在两个TU中而不会发生冲突,但我想知道实现这一目标的最佳方法是什么(静态?我不认为全局可以工作,多个定义)

3 个答案:

答案 0 :(得分:1)

您需要了解函数声明与其定义之间的区别。除模板和内联函数外,只有函数声明应该在头文件中,函数定义应该在翻译单元中。

void foobar( int ); // this is function declaration, now you can call this function
                    // you can put it on your sources as many times as you want

void foobar( int param ) { // this is function definition, it should appear only once
   ...
}

答案 1 :(得分:1)

如果您希望编译器将此函数视为每个CU中的不同函数,则可以将其定义包含在未命名的命名空间中。根据C ++ 2011 Standard,在未命名的命名空间中声明的实体具有内部链接。

答案 2 :(得分:1)

如果您希望它在每个TU中都是相同的功能,请使用inline。这正是inline的用途:标题中定义的共享函数。

在不可思议的事件中,您希望它在每个TU中都是不同的函数,请使用未命名的命名空间或static。我不认为该标准提供了一个官方视图,在C ++中哪一个是首选,但你会得到它的未命名命名空间的印象。

您想要哪一个取决于您首先将函数定义放在头文件中的原因,以及您打算如何使用标题。