【发布时间】:2013-05-26 22:36:48
【问题描述】:
我有一个全局辅助函数,它被头文件中的一堆宏使用。目的是通过简单地#include'ing 单个标头来允许宏可用(换句话说,我想将函数定义保留在标头中并避免将其放在单独的编译单元中)。但是,当应用程序#include 的此文件在多个编译单元中时,这会导致问题,因为出现重复符号问题。
辅助函数具有足够的特性,不应将其声明为内联。
我胡闹,发现使用未命名的命名空间解决了重复符号的问题,即:
namespace
{
void foo(...)
{
}
};
#define HELPER_A foo(1, ...);
#define HELPER_B foo(2, ...);
...
这种方法有什么缺点吗?有更好的选择吗?
【问题讨论】:
-
没有得到将定义放在 .cpp 文件中的问题。
-
您真的希望您的代码在不同的编译单元中复制吗?为什么不使用#pragma 一次?
-
你提到它不应该被声明为“内联”,但你真的想要一个离散的实现,因为每个编译单元都包含在其中 - 这似乎很浪费。为什么不把它放在自己的编译单元中,然后在头文件中简单地声明为“extern”呢?
-
I'd like to keep the function definition in the header and avoid putting it in a separate compilation unit为什么? -
The helper function has enough characteristics in which it shouldn't be declared inline我对此表示怀疑。如果编译器认为函数不应该被内联,那么它就不会被内联,但是inline关键字会给函数正确的链接以避免多重定义错误。
标签: c++