我有一个函数,它应该包含在两个不同的翻译单元(即 cpp 文件)中,来自一个共同的标题。
我可能会使用匿名命名空间将此函数包含在两个 TU 中而不会发生冲突,但我想知道实现此目的的最佳方法是什么(静态?我认为 global 不能工作,多个定义)
我有一个函数,它应该包含在两个不同的翻译单元(即 cpp 文件)中,来自一个共同的标题。
我可能会使用匿名命名空间将此函数包含在两个 TU 中而不会发生冲突,但我想知道实现此目的的最佳方法是什么(静态?我认为 global 不能工作,多个定义)
您需要了解函数声明和它的定义之间的区别。除了模板和内联函数,只有函数声明应该在头文件中,函数定义应该在翻译单元中。
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
...
}
如果您希望编译器将此函数视为每个 CU 中的不同函数,您可以将其定义包含在未命名的命名空间中。根据 C++ 2011 标准,在未命名命名空间中声明的实体具有内部链接。
如果您希望它在每个 TU 中都具有相同的功能,请使用inline
. 这正是inline
它的用途:在标头中定义的共享函数。
如果您希望它在每个 TU 中成为不同的函数,这种可能性不大,请使用未命名的命名空间或static
. 我不认为该标准给出了 C++ 中首选哪个标准的官方观点,但您会觉得它是未命名的命名空间。
您想要哪个取决于您首先将函数定义放在头文件中的原因,以及您打算如何使用头文件。