鱼C论坛

 找回密码
 立即注册
查看: 1111|回复: 2

[已解决]好奇怪的c/c++代码

[复制链接]
发表于 2021-8-16 11:08:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在.h文件中看到如下的代码,好奇怪的代码,各位有能给解释一下的吗?

#define MEMBER_PARAM_SET_GET(member, type, name, qualifier, setqualifier, getqualifier)\

getqualifier: inline type get##name() const {return member.get##name();}\

setqualifier: inline void set##name(type name) { member.set##name(name);}
最佳答案
2021-8-16 14:26:26
我找到这个代码了,下面的代码我删除了大部分内容,只保留讲解需要用到的内容
先说一下 PARAM_SET_GET 这个宏定义
这个宏会创建一个成员变量,然后创建一个 set 函数和一个 get 函数
#define PARAM_SET_GET(type, name, qualifier, setqualifier, getqualifier)\
qualifier: type m_##name;\
getqualifier: inline type get##name() const {return m_##name;}\
setqualifier: inline void set##name(type name) {m_##name=name;}


ScanMatcher 这个类使用了 PARAM_SET_GET 这个宏,创建了 laserMaxRange 这个成员变量,还有 set 函数 和 get 函数
class ScanMatcher{
    protected:
        PARAM_SET_GET(double, laserMaxRange, protected, public, public)
};

这个类,宏展开后是这样的,当然我调整了一下格式,更易于阅读
class ScanMatcher{
protected:
protected: double m_laserMaxRange;
public: inline double getlaserMaxRange() const {return m_laserMaxRange;}
public: inline void setlaserMaxRange(double laserMaxRange) {m_laserMaxRange=laserMaxRange;}
};

下面这个宏的作用是,导出作为成员变量 member 的 name 函数,就是包装一下
#define MEMBER_PARAM_SET_GET(member, type, name, qualifier, setqualifier, getqualifier)\
getqualifier: inline type get##name() const {return member.get##name();}\
setqualifier: inline void set##name(type name) { member.set##name(name);}

在类 GridSlamProcessor 中用到了 MEMBER_PARAM_SET_GET 这个宏
class GridSlamProcessor{

public:

/**the scanmatcher algorithm*/
ScanMatcher m_matcher;

//accessor methods
/**the maxrange of the laser to consider */
MEMBER_PARAM_SET_GET(m_matcher, double, laserMaxRange, protected, public, public);

protected:
/**Copy constructor*/
GridSlamProcessor(const GridSlamProcessor& gsp);
};

这个类,宏展开后是这样的,同样调整了格式,更易于阅读
class GridSlamProcessor{
public:
    ScanMatcher m_matcher;
public: inline double getlaserMaxRange() const {return m_matcher.getlaserMaxRange();}
public: inline void setlaserMaxRange(double laserMaxRange) { m_matcher.setlaserMaxRange(laserMaxRange);};

protected:
        GridSlamProcessor(const GridSlamProcessor& gsp);
};


下面是完整的代码
#define PARAM_SET_GET(type, name, qualifier, setqualifier, getqualifier)\
qualifier: type m_##name;\
getqualifier: inline type get##name() const {return m_##name;}\
setqualifier: inline void set##name(type name) {m_##name=name;}

class ScanMatcher{
    protected:
        PARAM_SET_GET(double, laserMaxRange, protected, public, public)
};

#define MEMBER_PARAM_SET_GET(member, type, name, qualifier, setqualifier, getqualifier)\
getqualifier: inline type get##name() const {return member.get##name();}\
setqualifier: inline void set##name(type name) { member.set##name(name);}

class GridSlamProcessor{

public:

/**the scanmatcher algorithm*/
ScanMatcher m_matcher;

//accessor methods
/**the maxrange of the laser to consider */
MEMBER_PARAM_SET_GET(m_matcher, double, laserMaxRange, protected, public, public);

protected:
/**Copy constructor*/
GridSlamProcessor(const GridSlamProcessor& gsp);
};

通过 g++ 预处理后是这样的
$ g++ -E main.cpp
# 1 "main.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.cpp"





class ScanMatcher{
    protected:
        protected: double m_laserMaxRange;public: inline double getlaserMaxRange() const {return m_laserMaxRange;}public: inline void setlaserMaxRange(double laserMaxRange) {m_laserMaxRange=laserMaxRange;}
};





class GridSlamProcessor{

public:


ScanMatcher m_matcher;



public: inline double getlaserMaxRange() const {return m_matcher.getlaserMaxRange();}public: inline void setlaserMaxRange(double laserMaxRange) { m_matcher.setlaserMaxRange(laserMaxRange);};

protected:

GridSlamProcessor(const GridSlamProcessor& gsp);
};

调整一下格式,使之更易于阅读
class ScanMatcher{
protected:
protected: double m_laserMaxRange;
public: inline double getlaserMaxRange() const {return m_laserMaxRange;}
public: inline void setlaserMaxRange(double laserMaxRange) {m_laserMaxRange=laserMaxRange;}
};

class GridSlamProcessor{
public:
    ScanMatcher m_matcher;
public: inline double getlaserMaxRange() const {return m_matcher.getlaserMaxRange();}
public: inline void setlaserMaxRange(double laserMaxRange) { m_matcher.setlaserMaxRange(laserMaxRange);};

protected:
        GridSlamProcessor(const GridSlamProcessor& gsp);
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-16 13:05:31 | 显示全部楼层
这个代码是哪里的?把使用这个宏的代码发出来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-16 14:26:26 | 显示全部楼层    本楼为最佳答案   
我找到这个代码了,下面的代码我删除了大部分内容,只保留讲解需要用到的内容
先说一下 PARAM_SET_GET 这个宏定义
这个宏会创建一个成员变量,然后创建一个 set 函数和一个 get 函数
#define PARAM_SET_GET(type, name, qualifier, setqualifier, getqualifier)\
qualifier: type m_##name;\
getqualifier: inline type get##name() const {return m_##name;}\
setqualifier: inline void set##name(type name) {m_##name=name;}


ScanMatcher 这个类使用了 PARAM_SET_GET 这个宏,创建了 laserMaxRange 这个成员变量,还有 set 函数 和 get 函数
class ScanMatcher{
    protected:
        PARAM_SET_GET(double, laserMaxRange, protected, public, public)
};

这个类,宏展开后是这样的,当然我调整了一下格式,更易于阅读
class ScanMatcher{
protected:
protected: double m_laserMaxRange;
public: inline double getlaserMaxRange() const {return m_laserMaxRange;}
public: inline void setlaserMaxRange(double laserMaxRange) {m_laserMaxRange=laserMaxRange;}
};

下面这个宏的作用是,导出作为成员变量 member 的 name 函数,就是包装一下
#define MEMBER_PARAM_SET_GET(member, type, name, qualifier, setqualifier, getqualifier)\
getqualifier: inline type get##name() const {return member.get##name();}\
setqualifier: inline void set##name(type name) { member.set##name(name);}

在类 GridSlamProcessor 中用到了 MEMBER_PARAM_SET_GET 这个宏
class GridSlamProcessor{

public:

/**the scanmatcher algorithm*/
ScanMatcher m_matcher;

//accessor methods
/**the maxrange of the laser to consider */
MEMBER_PARAM_SET_GET(m_matcher, double, laserMaxRange, protected, public, public);

protected:
/**Copy constructor*/
GridSlamProcessor(const GridSlamProcessor& gsp);
};

这个类,宏展开后是这样的,同样调整了格式,更易于阅读
class GridSlamProcessor{
public:
    ScanMatcher m_matcher;
public: inline double getlaserMaxRange() const {return m_matcher.getlaserMaxRange();}
public: inline void setlaserMaxRange(double laserMaxRange) { m_matcher.setlaserMaxRange(laserMaxRange);};

protected:
        GridSlamProcessor(const GridSlamProcessor& gsp);
};


下面是完整的代码
#define PARAM_SET_GET(type, name, qualifier, setqualifier, getqualifier)\
qualifier: type m_##name;\
getqualifier: inline type get##name() const {return m_##name;}\
setqualifier: inline void set##name(type name) {m_##name=name;}

class ScanMatcher{
    protected:
        PARAM_SET_GET(double, laserMaxRange, protected, public, public)
};

#define MEMBER_PARAM_SET_GET(member, type, name, qualifier, setqualifier, getqualifier)\
getqualifier: inline type get##name() const {return member.get##name();}\
setqualifier: inline void set##name(type name) { member.set##name(name);}

class GridSlamProcessor{

public:

/**the scanmatcher algorithm*/
ScanMatcher m_matcher;

//accessor methods
/**the maxrange of the laser to consider */
MEMBER_PARAM_SET_GET(m_matcher, double, laserMaxRange, protected, public, public);

protected:
/**Copy constructor*/
GridSlamProcessor(const GridSlamProcessor& gsp);
};

通过 g++ 预处理后是这样的
$ g++ -E main.cpp
# 1 "main.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.cpp"





class ScanMatcher{
    protected:
        protected: double m_laserMaxRange;public: inline double getlaserMaxRange() const {return m_laserMaxRange;}public: inline void setlaserMaxRange(double laserMaxRange) {m_laserMaxRange=laserMaxRange;}
};





class GridSlamProcessor{

public:


ScanMatcher m_matcher;



public: inline double getlaserMaxRange() const {return m_matcher.getlaserMaxRange();}public: inline void setlaserMaxRange(double laserMaxRange) { m_matcher.setlaserMaxRange(laserMaxRange);};

protected:

GridSlamProcessor(const GridSlamProcessor& gsp);
};

调整一下格式,使之更易于阅读
class ScanMatcher{
protected:
protected: double m_laserMaxRange;
public: inline double getlaserMaxRange() const {return m_laserMaxRange;}
public: inline void setlaserMaxRange(double laserMaxRange) {m_laserMaxRange=laserMaxRange;}
};

class GridSlamProcessor{
public:
    ScanMatcher m_matcher;
public: inline double getlaserMaxRange() const {return m_matcher.getlaserMaxRange();}
public: inline void setlaserMaxRange(double laserMaxRange) { m_matcher.setlaserMaxRange(laserMaxRange);};

protected:
        GridSlamProcessor(const GridSlamProcessor& gsp);
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 01:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表