当尝试在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];
}
Run Code Online (Sandbox Code Playgroud)
exaxt错误如下所示:
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
Run Code Online (Sandbox Code Playgroud)
还有一件事,这个函数通常被调用,函数的调用部分没有包含在内.
您必须将您的定义放在头文件中.
内联成员函数可以通过两种方式定义:
inline,并将定义放入头文件中,如下所示:
class ClassA
{
public:
void f();
};
inline void ClassA::f()
{
}
Run Code Online (Sandbox Code Playgroud)
如果将内联函数的定义放入.cpp文件中,如果从其他.cpp文件中调用它,则会从链接器中获得"未解析的外部"错误(C++ FAQ Lite).
我不认为它与被抛出的异常有关.即使没有抛出异常,我也可以在Visual C++ 2005中复制此问题.
我的猜测是它试图内联函数但无法找到它的定义,因为它是在一个单独的.cpp文件中.编译器可能进行了一些特殊处理,因为它识别inline了定义中的关键字.如果删除inline关键字,问题就会消失,链接也会成功.因此,如果要将定义视为内联,则需要将定义与其声明一起放在头文件中.
| 归档时间: |
|
| 查看次数: |
1762 次 |
| 最近记录: |