6

我有一个全局帮助函数,由头文件中的一堆宏使用。目的是通过简单地 'ing 单个标头来允许宏可用#include(换句话说,我想将函数定义保留在标头中,并避免将其放在单独的编译单元中)。但是,当应用程序#include的此文件在多个编译单元中时,这会导致问题,因为出现重复符号问题。

辅助函数具有足够的特性,不应将其声明为内联。

我搞砸了,发现使用未命名的命名空间解决了重复符号的问题,即:

namespace
{
    void foo(...)
    {
    }
};

#define HELPER_A foo(1, ...);
#define HELPER_B foo(2, ...);
...

这种方法有什么缺点吗?有更好的选择吗?

4

1 回答 1

4

您的项目中只允许有一个函数定义,除非它被标记为inline. 您可以拥有任意数量的函数声明(也称为函数原型)。

将您的函数定义移动到 .cpp 文件中,并将声明留在头文件中

void foo(...); // no function body makes this a declaration only

或者你可以标记它inline

inline void foo(...) { /* ... */ } 

inline作为一般规则,函数应该小且计算速度快。

于 2013-05-31T07:22:42.937 回答