0

我有一个函数,它应该包含在两个不同的翻译单元(即 cpp 文件)中,来自一个共同的标题。

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

4

3 回答 3

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
   ...
}
于 2013-11-06T15:42:03.170 回答
1

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

于 2013-11-06T15:58:57.380 回答
1

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

如果您希望它在每个 TU 中成为不同的函数,这种可能性不大,请使用未命名的命名空间或static. 我不认为该标准给出了 C++ 中首选哪个标准的官方观点,但您会觉得它是未命名的命名空间。

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

于 2013-11-06T19:42:29.343 回答