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

C++ 避免重复符号并在头文件中保留代码,c++,C++,我有一个全局助手函数,它由头文件中的一组宏使用。其目的是通过简单地#包含”单个头(换句话说,我希望将函数定义保留在头中,避免将其放在单独的编译单元中)来允许宏可用。但是,当应用程序将此文件包含在多个编译单元中时,就会出现问题,因为会出现重复符号问题 helper函数具有足够的特性,不应在其中内联声明 我胡思乱想,发现使用未命名的名称空间可以解决重复符号的问题,即: namespace { void foo(...) { } }; #define HELPER_A foo

我有一个全局助手函数,它由头文件中的一组宏使用。其目的是通过简单地
#包含
”单个头(换句话说,我希望将函数定义保留在头中,避免将其放在单独的编译单元中)来允许宏可用。但是,当应用程序将此文件包含在多个编译单元中时,就会出现问题,因为会出现重复符号问题

helper函数具有足够的特性,不应在其中内联声明

我胡思乱想,发现使用未命名的名称空间可以解决重复符号的问题,即:

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

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

这种方法有什么缺点吗?有更好的替代方案吗?

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

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

void foo(...); // no function body makes this a declaration only
或者您可以将其标记为
内联

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

内联
函数通常应该很小,计算速度也很快。

不明白将定义放入.cpp文件有什么问题。是否确实要在不同的编译单元中复制代码?为什么不使用#pragma一次呢?你提到它不应该被声明为“内联”,但是你真的想要它的一个离散实现吗?因为每个编译单元都包含在其中——这似乎是浪费。为什么不把它放在自己的编译单元中,并在头文件中简单地声明它为“extern”?
我想把函数定义保留在头文件中,避免将它放在单独的编译单元中
为什么?
helper函数有足够的特性,不应该在其中内联声明它
,我对此表示怀疑。如果编译器认为函数不应该内联,那么它就不会内联,但是
inline
关键字将为函数提供正确的链接,以避免多定义错误。虽然您的答案实际上是准确的,OP已经提到了这两种方法,而你没有解决为什么OP现在应该考虑当他没有选择之前。