命名空间中的内联函数在gcc上的链接期间生成重复的符号

dob*_*ler 9 c++ gcc inline duplicates

我有一个带有内联函数的命名空间,如果有多个源文件,它将被使用.尝试链接我的应用程序时,内联函数将报告为重复符号.似乎我的代码不会内联函数,我想知道这是否是预期的行为以及如何最好地处理它.

我使用以下gcc选项:-g -Wextra -pedantic -Wmissing-field-initializers -Wredundant-decls -Wfloat-equal -Wno-reorder -Wno-long-long相同的代码样式似乎在构建时正确编译和链接一个VC7环境.

以下代码示例显示了代码的结构:

/* header.h */
namespace myNamespace {
inline bool myFunction() {return true;}
}

/* use_1.cpp */
#include "header.h"
...
bool OK = myNamespace::myFunction();
...

/* use_2.cpp */
#include "header.h"
...
bool OK = myNamespace::myFunction();
...
Run Code Online (Sandbox Code Playgroud)

Kar*_*nek -1

inline 关键字仅被编译器视为提示。如果编译器认为该函数在不内联的情况下性能会更好,则不会内联它。有一些特定于供应商的关键字使编译器内联函数 - 它__attribute__((always_inline))适用于 GCC 和__forceinlineVisual C++。

如果您确实想确保您的函数在所有标准编译器上的所有情况下都不会导致链接器错误,您可能希望将其模板化,因为即使在标头中定义,模板化函数也保证不会导致链接器错误。然而,对于非常简单的功能来说,这是完全没有必要的。

  • 如果您正确编写代码,则不会导致链接器错误。在不需要模板的地方编写模板是无稽之谈。 (2认同)
  • C++ 编译器是否内联函数在这里并不重要。编译器根据 as-if 规则透明地处理这个问题。然而“内联”会影响程序的语义。无论编译器是否实际内联该函数,这里都是合适的。请研究“单一定义规则”。 (2认同)