inline 函数的奇怪事件

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 函数必须对调用它的对象可见 否则会出错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值