当尝试在 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/