inline 一般在使用的时候就被我们当做#define的替代品 或者为了提高程序的速度而在函数前面加上inline
今天写代码的时候发现一个奇怪的事情
加入我们有2个类
class CInlineTest1
{
public:
CInlineTest1(void);
~CInlineTest1(void);
public:
inline void DoSth(void);
};
void CInlineTest1::DoSth( void )
{
printf("CInlineTest1::DoSth/n");
}
class CInlineTest2
{
public:
CInlineTest2(void);
~CInlineTest2(void);
public:
void DoSth( CInlineTest1 * ptest );
};
void CInlineTest2::DoSth( CInlineTest1 * ptest )
{
//printf("DoStm");
ptest->DoSth();
}
分别在不同的cpp里面 注意到在CInlineTest2的DoSth里面调用了CInlineTest1的DoSth
而CInlineTest1的DoSth 是一个inline函数
结果编译就会出现下列错误:
1>InlineTest2.obj : error LNK2019: unresolved external symbol "public: void __thiscall CInlineTest1::DoSth(void)" (?DoSth@CInlineTest1@@QAEXXZ) referenced in function "public: void __thiscall CInlineTest2::DoSth(class CInlineTest1 *)" (?DoSth@CInlineTest2@@QAEXPAVCInlineTest1@@@Z)
1>E:/MyCode/inlinetest/Debug/inlinetest.exe : fatal error LNK1120: 1 unresolved externals
解决方法
1. 如果是vs下开发的话, inline 换成 vc独有的 __inline
class CInlineTest1
{
public:
CInlineTest1(void);
~CInlineTest1(void);
public:
__inline void DoSth(void);
};
2。添加CInlineTest.inl 并且把inline函数都放到inl文件里面去
class CInlineTest1
{
public:
CInlineTest1(void);
~CInlineTest1(void);
public:
inline void DoSth(void);
};
#include "InlineTest1.inl"
3。将函数体直接写在类的定义里面, 我们知道类声明里实现的函数都是inline函数
class CInlineTest1
{
public:
CInlineTest1(void);
~CInlineTest1(void);
public:
void DoSth(void){ printf(“do some thing/n”) };
};
残念, 这个问题很有趣
原因是: inline 函数必须对调用它的对象可见 否则会出错