【问题标题】:Avoiding duplicate symbols and retaining code in header files避免重复符号并在头文件中保留代码
【发布时间】: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++


【解决方案1】:

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

将你的函数定义移动到一个 .cpp 文件中,然后将 声明留在头文件中

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

或者你可以标记它inline:

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

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

【讨论】:

  • 虽然您的回答实际上是准确的,但 OP 已经提到了这两种方法,而您未能解决 为什么 OP 现在应该在他之前选择不考虑它们的情况下考虑它们。
猜你喜欢
  • 2019-08-30
  • 2018-09-01
  • 2014-03-07
  • 2012-04-30
  • 2021-06-20
  • 2011-09-03
  • 1970-01-01
相关资源
最近更新 更多