代码之家  ›  专栏  ›  技术社区  ›  vtd-xml-author

Visual C++在尝试内联函数时链接错误

c++
  •  3
  • vtd-xml-author  · 技术社区  · 16 年前

    当试图在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];
    }
    

    EXEXT错误如下所示:

    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
    

    还有一件事,这个函数在正常情况下被调用,函数的调用部分不包括在内。

    1 回复  |  直到 12 年前
        1
  •  9
  •   jasonline    16 年前

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

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

    • 在类主体本身中定义成员函数。
    • inline 并将定义放入头文件中,如下所示:
    
    class ClassA
    {
    public:
        void f();
    };
    
    inline void ClassA::f()
    {
    }
    

    C++ FAQ Lite )从链接器。

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

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