【问题标题】:inline keyword causes linker error 2019 in Visual C++inline 关键字导致 Visual C++ 中的链接器错误 2019
【发布时间】:2013-10-27 20:47:47
【问题描述】:

我已经停止使用 MSVC,并且隐约记得内联类成员函数没有问题。但是,当我这样使用 inline 关键字时:

//In header file
class A {
    public:
        inline void funcA(void);
};

//In cpp file
void A::funcA(void) {

}

我得到一个 LNK2019,未解析的符号(即使该函数与错误所说的缺失完全匹配)。我尝试将标题和定义都标记为内联,并且发生了同样的事情。在尝试构建后,我还删除了 inline 关键字,并且错误一直存在,直到我清理解决方案,之后一切都构建良好的 sans-inline。当我用谷歌搜索问题时,似乎没有人遇到同样的问题,这表明我遗漏了一些明显的东西......但它是什么?

【问题讨论】:

  • funcA 是否在另一个翻译单元中使用,而不是在其中定义的翻译单元中使用?如果是这样,那就是导致错误的原因,因为编译器需要知道定义才能用函数体替换调用。每个翻译单元都需要一个相同的定义,因此它可能应该放在标题中,而不是 cpp 文件中

标签: c++ visual-studio visual-c++ inline


【解决方案1】:

内联函数应始终在标题中定义。它不必在类定义中,但应该在标题中。如果你没有把它放在头文件中,包括.h文件在内的其他模块将无法看到定义并内联它....

供您参考,最新版本的 Visual C++ 具有链接时间代码生成功能,它允许编译器内联其他模块(= cpp 文件)中的函数,即使要内联的函数是在其他 .cpp 文件中定义的。但这是一个专有扩展,并且不考虑 inline 关键字。便携的方式是使用inline,放在header中。

【讨论】:

  • 为了将来参考,如果我想内联一个很长的公共函数,因为它只使用一次,该怎么办?我应该在标题中定义它,还是根本不内联它?
  • 如果在定义它的类之外使用,它必须在标题中。
  • @NmdMystery 不过,您可以将它放在类声明之后,这样人们就可以在没有大方法的情况下看到该类。如果上面显示的所有代码都在标题中,那就没问题了。
【解决方案2】:

一旦您将内联成员设为公开或受保护,您应该将定义放在标题中。豁免是私有内联(没有任何朋友访问),如果它仅在源中使用。 (可能需要清理来修复预编译的头文件)

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2015-01-13
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多