c++ - 尝试内联函数时 Visual C++ 中的链接错误

标签 c++

当尝试在 Visual C++(2008 express)中内联一个函数时,我遇到了一个链接错误,在仔细检查代码后,我发现我试图内联的函数抛出了一个异常......如果我删除了异常抛出,链接错误消失了,有人可以解释为什么会这样吗?

int com_ximpleware::FastIntBuffer::intAt(int index){
    if (index < 0 || index > size - 1) {
       throw InvalidArgumentException("invalid index range in FastIntBuffer's intAt()");
    }
    return ((int *) al->get(index>>exp))[index & r];
}

具体错误如下所示:

intHash.obj : error LNK2019: unresolved external symbol "public: int __thiscall com_ximpleware::FastIntBuffer::intAt(int)" (?intAt@FastIntBuffer@com_ximpleware@@QAEHH@Z) referenced in function __catch$?isUnique@IntHash@com_ximpleware@@QAE_NH@Z$0
1>C:\new_cvs\cpp_test1\Debug\cpp_test1.exe : fatal error LNK1120: 1 unresolved externals

还有一点,这个函数被正常调用了,函数的调用部分没有被包含在内。

最佳答案

您必须将定义放在头文件中。

内联成员函数可以通过两种方式定义:

  • 在类主体中定义成员函数。
  • 像类中的普通成员函数一样声明成员函数,但是当您定义内联成员函数时,在成员函数的定义前加上关键字 inline 并将定义放入头文件中,像下面这样:

class ClassA
{
public:
    void f();
};

inline void ClassA::f()
{
}

如果您将内联函数的定义放入一个 .cpp 文件中,并且如果它是从某个其他 .cpp 文件调用的,您将从链接器收到“ Unresolved external ”错误 (C++ FAQ Lite)。

我认为这与抛出的异常无关。即使没有抛出异常,我也可以在 Visual C++ 2005 中复制这个问题。

我的猜测是它试图内联函数但找不到它的定义,因为它在一个单独的 .cpp 文件中。编译器可能做了一些特殊处理,因为它识别了定义中的 inline 关键字。如果删除 inline 关键字,问题就会消失并且链接成功。因此,如果您希望它被视为内联,则需要将定义及其声明放在头文件中。

关于c++ - 尝试内联函数时 Visual C++ 中的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2542447/

相关文章:

c++ - 为什么在使用auto&&it=--vec.end()时自动推导左值引用,是UB吗?

c# - 实现共享内存时要考虑的要点

c++ - Release模式下的 Xcode 无法编译 <immintrin.h> - 提示 __builtin_ia32_emms()

c++ - 如何在 C++ 中格式化输出

c++ - 模板函数无法识别由 auto 变量引用的 lambda

c++ - boost 线程和 shared_ptr

c++ - 将拆分的 TCP 数据包与闪存套接字重新组合

c++ - 如何向 Qt 4.8.6 添加自定义小部件

c++ - 在 Windows 中的不同位置初始化变量会出错

c++ - 为什么 C++ 参数类型匹配中的 `"文字 "` encouraged to decay to ` const char*`?