鱼C论坛

 找回密码
 立即注册
查看: 1319|回复: 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 函数
  1. #define PARAM_SET_GET(type, name, qualifier, setqualifier, getqualifier)\
  2. qualifier: type m_##name;\
  3. getqualifier: inline type get##name() const {return m_##name;}\
  4. setqualifier: inline void set##name(type name) {m_##name=name;}
复制代码



ScanMatcher 这个类使用了 PARAM_SET_GET 这个宏,创建了 laserMaxRange 这个成员变量,还有 set 函数 和 get 函数
  1. class ScanMatcher{
  2.     protected:
  3.         PARAM_SET_GET(double, laserMaxRange, protected, public, public)
  4. };
复制代码


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


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


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

  2. public:

  3. /**the scanmatcher algorithm*/
  4. ScanMatcher m_matcher;

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

  8. protected:
  9. /**Copy constructor*/
  10. GridSlamProcessor(const GridSlamProcessor& gsp);
  11. };
复制代码


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

  6. protected:
  7.         GridSlamProcessor(const GridSlamProcessor& gsp);
  8. };
复制代码



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

  5. class ScanMatcher{
  6.     protected:
  7.         PARAM_SET_GET(double, laserMaxRange, protected, public, public)
  8. };

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

  12. class GridSlamProcessor{

  13. public:

  14. /**the scanmatcher algorithm*/
  15. ScanMatcher m_matcher;

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

  19. protected:
  20. /**Copy constructor*/
  21. GridSlamProcessor(const GridSlamProcessor& gsp);
  22. };
复制代码


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





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





  10. class GridSlamProcessor{

  11. public:


  12. ScanMatcher m_matcher;



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

  14. protected:

  15. GridSlamProcessor(const GridSlamProcessor& gsp);
  16. };
复制代码


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

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

  12. protected:
  13.         GridSlamProcessor(const GridSlamProcessor& gsp);
  14. };
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-16 13:05:31 | 显示全部楼层
这个代码是哪里的?把使用这个宏的代码发出来看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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



ScanMatcher 这个类使用了 PARAM_SET_GET 这个宏,创建了 laserMaxRange 这个成员变量,还有 set 函数 和 get 函数
  1. class ScanMatcher{
  2.     protected:
  3.         PARAM_SET_GET(double, laserMaxRange, protected, public, public)
  4. };
复制代码


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


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


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

  2. public:

  3. /**the scanmatcher algorithm*/
  4. ScanMatcher m_matcher;

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

  8. protected:
  9. /**Copy constructor*/
  10. GridSlamProcessor(const GridSlamProcessor& gsp);
  11. };
复制代码


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

  6. protected:
  7.         GridSlamProcessor(const GridSlamProcessor& gsp);
  8. };
复制代码



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

  5. class ScanMatcher{
  6.     protected:
  7.         PARAM_SET_GET(double, laserMaxRange, protected, public, public)
  8. };

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

  12. class GridSlamProcessor{

  13. public:

  14. /**the scanmatcher algorithm*/
  15. ScanMatcher m_matcher;

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

  19. protected:
  20. /**Copy constructor*/
  21. GridSlamProcessor(const GridSlamProcessor& gsp);
  22. };
复制代码


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





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





  10. class GridSlamProcessor{

  11. public:


  12. ScanMatcher m_matcher;



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

  14. protected:

  15. GridSlamProcessor(const GridSlamProcessor& gsp);
  16. };
复制代码


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

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

  12. protected:
  13.         GridSlamProcessor(const GridSlamProcessor& gsp);
  14. };
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 21:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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