在定义一个类的读写属性的时候,通过会使用内联函数。内联函数以空间换时间~
在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函数的时候,编译器可以选择直接通过替换函数体里面的代码。也就是说直接进行如下操作:
内联函数发生上面那种替换是在编译期间,在编译期间编译器为了找到需要找到内联函数的定义,所以在为了方便编译器找到定义,每个文件引用头文件后,都直接拥有这种定义,而不用再去写。
而普通函数可以申明和定义分离,主要是编译阶段就不需要函数定义。首先编译阶段找到函数的申明,链接阶段才会去找函数的定义,将之关联起来。
#ifndef BARRECT_H
#define BARRECT_H
#include
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
链接: 内联函数为什么定义在头文件中?