我有一个带有内联函数的命名空间,如果有多个源文件,它将被使用。 尝试链接我的应用程序时,内联函数将报告为重复符号。 似乎我的代码不会内联函数,我想知道这是否是预期的行为以及如何最好地处理它。
我使用以下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();
...
答案 0 :(得分:0)
删除dll / exe的生成目录,然后重新编译。
该版本可能存在一些问题。 OP可能在上面的评论中提到了它的预编译头信息。我遇到了完全相同的问题,删除了构建目录并重新编译即可解决该问题。
答案 1 :(得分:-1)
inline关键字仅作为编译器的提示。如果编译器确定函数在没有内联的情况下表现更好,则不会内联它。有特定于供应商的关键字使编译器内联一个函数 - GCC为__attribute__((always_inline))
,Visual C ++为__forceinline
。
如果你真的想确保你的函数在所有标准编译器的所有情况下都不会导致链接器错误,你可能想要模板化,因为模板化函数保证即使在头文件中定义也不会导致链接器错误。然而,对于非常简单的函数来说,这是非常不必要的。