避免重复符号并在头文件中保留代码

Avoiding duplicate symbols and retaining code in header files

本文关键字:文件 保留 代码 符号      更新时间:2023-10-16

我有一个全局辅助函数,由头文件中的一堆宏使用。这样做的目的是允许宏通过简单地对单个头文件进行#include来使用(换句话说,我希望将函数定义保留在头文件中,而避免将其放在单独的编译单元中)。但是,当应用程序#include在多个编译单元中使用该文件时,就会出现重复符号问题。

helper函数有足够的特征,不应该将其声明为内联。

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

namespace
{
    void foo(...)
    {
    }
};
#define HELPER_A foo(1, ...);
#define HELPER_B foo(2, ...);
...

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

你只允许一个函数定义在你的项目,除非它标记为inline。你可以有任意多的函数声明(又称函数原型)。

将函数定义移动到.cpp文件中,只保留声明在头文件

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

或者你可以标记为inline:

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

inline函数通常应该很小,计算速度快。