内联函数在头文件内定义

27 篇文章 1 订阅

背景

在定义一个类的读写属性的时候,通过会使用内联函数。内联函数以空间换时间~

错误

在Qt中创建了一个类,然后将inline函数定义在了xxx.cpp文件中,会报错:

rectmgr.obj:-1: error: LNK2019: 无法解析的外部符号 "public: void __cdecl BarRect::set_id(unsigned int)" (?set_id@BarRect@@QEAAXI@Z),函数 "public: void __cdecl RectMgr::create_kmd_map(void)" (?create_kmd_map@RectMgr@@QEAAXXZ) 中引用了该符号

解决

将定义的inline内联函数转移到头文件xxx.h中,报错消失

内联函数替换

简单点来说:内联函数就是把函数直接用函数体里面的代码替换。

内联函数就是把函数直接用函数体里面的代码替换:这句话意思就是说当我们调用abs函数的时候,编译器可以选择直接通过替换函数体里面的代码。也就是说直接进行如下操作:

内联函树为什么定义在头文件?

内联函数发生上面那种替换是在编译期间,在编译期间编译器为了找到需要找到内联函数的定义,所以在为了方便编译器找到定义,每个文件引用头文件后,都直接拥有这种定义,而不用再去写。

而普通函数可以申明和定义分离,主要是编译阶段就不需要函数定义。首先编译阶段找到函数的申明,链接阶段才会去找函数的定义,将之关联起来。

Code

#ifndef BARRECT_H
#define BARRECT_H

#include <QRect>



class BarRect : public QRectF
{
    enum bar_location_e{
        BAR_INSIDE = 0,
        BAR_OUTSIDE = 1,
        BAR_MIDDLE = 2,
    };

public:
    BarRect();
    ~BarRect();

    quint32 id() const;
    void set_id(quint32 id);

    quint8 level() const;
    void set_level(quint8 level);

    bar_location_e location() const;
    void set_bar_location(bar_location_e location);

private:
    quint32 id_;                            // id_
    quint8 level_;                          // level_
    bar_location_e location_;          // in bar area flag
};

inline quint32 BarRect::id() const
{
    return id_;
}

inline void BarRect::set_id(quint32 id)
{
    id_ = id;
}

inline quint8 BarRect::level() const
{
    return level_;
}

inline void BarRect::set_level(quint8 level)
{
    level_ = level;
}

inline BarRect::bar_location_e BarRect::location() const
{
    return location_;
}

inline void BarRect::set_bar_location(bar_location_e location)
{
    location_ = location;
}

#endif // BARRECT_H

参考

链接: 内联函数为什么定义在头文件中?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值