2010-03-30 106 views
3

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

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]; 
} 

如下所示的exaxt错误:

intHash.obj : error LNK2019: unresolved external symbol "public: int __thiscall com_ximpleware::FastIntBuffer::intAt(int)" ([email protected]@[email protected]@[email protected]) referenced in function [email protected]@[email protected]@[email protected]$0 
1>C:\new_cvs\cpp_test1\Debug\cpp_test1.exe : fatal error LNK1120: 1 unresolved externals 

一两件事,这个函数被调用别的正常,没有被列入该函数的调用部分。

+0

当你将它嵌入时,是否将它移动到头文件中? – 2010-03-30 02:58:20

+0

我把定义(即实现)在标题中,并没有问题...我必须将其移动到标题以内联它吗?我以为我可以声明它是一个内联函数,不是吗? – 2010-03-30 03:21:44

+0

无论它在哪里调用,它都必须是可见的,所以通常它必须位于头文件中。 – Darryl 2010-03-30 03:33:48

回答

9

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

内联成员函数可以用两种方式来定义:

  • 定义在类体内自身的成员函数。
  • 宣布该成员函数就像类中的普通成员函数,但是当你定义内联成员函数,前面加上成员函数的定义与关键字inline并且将定义成一个头文件,如下所示:

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

inline void ClassA::f() 
{ 
} 

如果将内联函数的定义放在.cpp文件,它如果是从其他.cpp文件调用,你会得到从链接的“无法解析的外部”错误(C++ FAQ Lite)。

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

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

相关问题