分享

gcc

 Tornador 2017-02-17

利用gcc -E选项,可以得到预编译后的文件。这可以得到宏展开后的文件。

先来看看几个相关联的文件吧!

  1. #ifndef __DEFS_H__  
  2. #define __DEFS_H__  
  3.   
  4. #ifdef WIN32  
  5.     #define snprintf _snprintf  
  6. #endif  
  7.   
  8. // Join two variables  
  9. #define MACRO_JOIN( X, Y ) MACRO_DO_JOIN( X, Y )  
  10. #define MACRO_DO_JOIN( X, Y ) MACRO_DO_JOIN2(X,Y)  
  11. #define MACRO_DO_JOIN2( X, Y ) X##Y  
  12.   
  13. #endif //__DEFS_H__  


  1. // Signal.h(宏定义的模板类)  
  2.   
  3. /// \class SIGNAL_SIGNAL  
  4. /// \brief 信号类模块。  
  5. ///  
  6. /// 一个信号被触发时,会调用所有连接到其上的TFunctionN对象,只支持  
  7. /// 返回值为void的TFunctionN。SIGNAL_SIGNAL是一个宏,根据参数个数会被替换成  
  8. /// TSignalN,用户通过 TSignalN<T1, T2, T3,..,TN>方式来使用,TN表示参数类型,   
  9. /// N表示函数参数个数,目前最大参数为6。  
  10. /// \see FUNCTION_FUNCTION  
  11.   
  12. #define SIGNAL_SIGNAL MACRO_JOIN(TSignal,SIGNAL_NUMBER)  
  13. #define FUNCTION_FUNCTION MACRO_JOIN(TFunction, SIGNAL_NUMBER)  
  14.   
  15. #include "Defs.h"  
  16.   
  17. #if (SIGNAL_NUMBER != 0)  
  18. template <SIGNAL_CLASS_TYPES>  
  19. #endif  
  20. class SIGNAL_SIGNAL  
  21. {  
  22.     /// 与信号模板参数类型匹配的函数指针对象类型  
  23.     typedef FUNCTION_FUNCTION<void SIGNAL_TYPES_COMMA> SigProc;  
  24.   
  25. public:  
  26.     /// 构造函数  
  27.     /// \param maxSlots 能够连接的最大函数指针对象的个数  
  28.     SIGNAL_SIGNAL(int maxSlots) :  
  29.       m_numberMax(maxSlots), m_number(0)  
  30.     {  
  31.     }  
  32.       
  33.      /// 析构函数  
  34.     ~SIGNAL_SIGNAL()  
  35.     {  
  36.     }  
  37. };  
  38.   
  39. #undef SIGNAL_SIGNAL  
  40. #undef FUNCTION_FUNCTION  

  1. // Signals.h(最终生成的6个模板类)  
  2.   
  3. #ifndef __INIFRA_SIGNALS_H__  
  4. #define __INIFRA_SIGNALS_H__  
  5.   
  6. //TSignal0  
  7. #define SIGNAL_NUMBER 0  
  8. #define SIGNAL_CLASS_TYPES void  
  9. #define SIGNAL_TYPES_COMMA  
  10. #define SIGNAL_TYPE_ARGS void   
  11. #define SIGNAL_ARGS  
  12. #include "Signal.h"  
  13. #undef  SIGNAL_NUMBER  
  14. #undef  SIGNAL_CLASS_TYPES  
  15. #undef  SIGNAL_TYPES_COMMA  
  16. #undef  SIGNAL_TYPE_ARGS  
  17. #undef  SIGNAL_ARGS  
  18.   
  19. //TSignal1  
  20. #define SIGNAL_NUMBER 1  
  21. #define SIGNAL_CLASS_TYPES typename T1  
  22. #define SIGNAL_TYPES_COMMA , T1  
  23. #define SIGNAL_TYPE_ARGS T1 a1   
  24. #define SIGNAL_ARGS a1   
  25. #include "Signal.h"  
  26. #undef  SIGNAL_NUMBER  
  27. #undef  SIGNAL_CLASS_TYPES  
  28. #undef  SIGNAL_TYPES_COMMA  
  29. #undef  SIGNAL_TYPE_ARGS  
  30. #undef  SIGNAL_ARGS  
  31.   
  32. //TSignal2  
  33. #define SIGNAL_NUMBER 2  
  34. #define SIGNAL_CLASS_TYPES typename T1, typename T2  
  35. #define SIGNAL_TYPES_COMMA , T1, T2  
  36. #define SIGNAL_TYPE_ARGS T1 a1, T2 a2  
  37. #define SIGNAL_ARGS a1, a2  
  38. #include "Signal.h"  
  39. #undef  SIGNAL_NUMBER  
  40. #undef  SIGNAL_CLASS_TYPES  
  41. #undef  SIGNAL_TYPES_COMMA  
  42. #undef  SIGNAL_TYPE_ARGS  
  43. #undef  SIGNAL_ARGS  
  44.   
  45. //TSignal3  
  46. #define SIGNAL_NUMBER 3  
  47. #define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3  
  48. #define SIGNAL_TYPES_COMMA , T1, T2, T3  
  49. #define SIGNAL_TYPE_ARGS T1 a1, T2 a2, T3 a3  
  50. #define SIGNAL_ARGS a1, a2, a3  
  51. #include "Signal.h"  
  52. #undef  SIGNAL_NUMBER  
  53. #undef  SIGNAL_CLASS_TYPES  
  54. #undef  SIGNAL_TYPES_COMMA  
  55. #undef  SIGNAL_TYPE_ARGS  
  56. #undef  SIGNAL_ARGS  
  57.   
  58. //TSignal4  
  59. #define SIGNAL_NUMBER 4  
  60. #define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3, typename T4  
  61. #define SIGNAL_TYPES_COMMA , T1, T2, T3, T4  
  62. #define SIGNAL_TYPE_ARGS T1 a1, T2 a2, T3 a3, T4 a4  
  63. #define SIGNAL_ARGS a1, a2, a3, a4  
  64. #include "Signal.h"  
  65. #undef  SIGNAL_NUMBER  
  66. #undef  SIGNAL_CLASS_TYPES  
  67. #undef  SIGNAL_TYPES_COMMA  
  68. #undef  SIGNAL_TYPE_ARGS  
  69. #undef  SIGNAL_ARGS  
  70.   
  71. //TSignal5  
  72. #define SIGNAL_NUMBER 5  
  73. #define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3, typename T4, typename T5  
  74. #define SIGNAL_TYPES_COMMA , T1, T2, T3, T4, T5  
  75. #define SIGNAL_TYPE_ARGS T1 a1, T2 a2, T3 a3, T4 a4, T5 a5   
  76. #define SIGNAL_ARGS a1, a2, a3, a4, a5  
  77. #include "Signal.h"  
  78. #undef  SIGNAL_NUMBER  
  79. #undef  SIGNAL_CLASS_TYPES  
  80. #undef  SIGNAL_TYPES_COMMA  
  81. #undef  SIGNAL_TYPE_ARGS  
  82. #undef  SIGNAL_ARGS  
  83.   
  84. //TSignal6  
  85. #define SIGNAL_NUMBER 6  
  86. #define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3, typename T4, typename T5, typename T6  
  87. #define SIGNAL_TYPES_COMMA , T1, T2, T3, T4, T5, T6  
  88. #define SIGNAL_TYPE_ARGS T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6  
  89. #define SIGNAL_ARGS a1, a2, a3, a4, a5, a6  
  90. #include "Signal.h"  
  91. #undef  SIGNAL_NUMBER  
  92. #undef  SIGNAL_CLASS_TYPES  
  93. #undef  SIGNAL_TYPES_COMMA  
  94. #undef  SIGNAL_TYPE_ARGS  
  95. #undef  SIGNAL_ARGS  
  96.   
  97. #endif //__SIGNALS_H__  

通过gcc -E 选项,我们对Signals.h进行预编译,即可得到宏展开后的文件,内容如下:

  1. # 1 "Signals.h"  
  2. # 1 "<command-line>"  
  3. # 1 "Signals.h"  
  4. # 10 "Signals.h"  
  5. # 1 "Signal.h" 1  
  6. # 13 "Signal.h"  
  7. # 1 "Defs.h" 1  
  8. # 14 "Signal.h" 2  
  9.   
  10.   
  11.   
  12.   
  13. class TSignal0  
  14. {  
  15.   
  16.  typedef TFunction0<void > SigProc;  
  17.   
  18. public:  
  19.   
  20.   
  21.  TSignal0(int maxSlots) :  
  22.    m_numberMax(maxSlots), m_number(0)  
  23.  {  
  24.  }  
  25.   
  26.   
  27.  ~TSignal0()  
  28.  {  
  29.  }  
  30. };  
  31. # 11 "Signals.h" 2  
  32. # 23 "Signals.h"  
  33. # 1 "Signal.h" 1  
  34. # 16 "Signal.h"  
  35. template <typename T1>  
  36.   
  37. class TSignal1  
  38. {  
  39.   
  40.  typedef TFunction1<void , T1> SigProc;  
  41.   
  42. public:  
  43.   
  44.   
  45.  TSignal1(int maxSlots) :  
  46.    m_numberMax(maxSlots), m_number(0)  
  47.  {  
  48.  }  
  49.   
  50.   
  51.  ~TSignal1()  
  52.  {  
  53.  }  
  54. };  
  55. # 24 "Signals.h" 2  
  56. # 36 "Signals.h"  
  57. # 1 "Signal.h" 1  
  58. # 16 "Signal.h"  
  59. template <typename T1, typename T2>  
  60.   
  61. class TSignal2  
  62. {  
  63.   
  64.  typedef TFunction2<void , T1, T2> SigProc;  
  65.   
  66. public:  
  67.   
  68.   
  69.  TSignal2(int maxSlots) :  
  70.    m_numberMax(maxSlots), m_number(0)  
  71.  {  
  72.  }  
  73.   
  74.   
  75.  ~TSignal2()  
  76.  {  
  77.  }  
  78. };  
  79. # 37 "Signals.h" 2  
  80. # 49 "Signals.h"  
  81. # 1 "Signal.h" 1  
  82. # 16 "Signal.h"  
  83. template <typename T1, typename T2, typename T3>  
  84.   
  85. class TSignal3  
  86. {  
  87.   
  88.  typedef TFunction3<void , T1, T2, T3> SigProc;  
  89.   
  90. public:  
  91.   
  92.   
  93.  TSignal3(int maxSlots) :  
  94.    m_numberMax(maxSlots), m_number(0)  
  95.  {  
  96.  }  
  97.   
  98.   
  99.  ~TSignal3()  
  100.  {  
  101.  }  
  102. };  
  103. # 50 "Signals.h" 2  
  104. # 62 "Signals.h"  
  105. # 1 "Signal.h" 1  
  106. # 16 "Signal.h"  
  107. template <typename T1, typename T2, typename T3, typename T4>  
  108.   
  109. class TSignal4  
  110. {  
  111.   
  112.  typedef TFunction4<void , T1, T2, T3, T4> SigProc;  
  113.   
  114. public:  
  115.   
  116.   
  117.  TSignal4(int maxSlots) :  
  118.    m_numberMax(maxSlots), m_number(0)  
  119.  {  
  120.  }  
  121.   
  122.   
  123.  ~TSignal4()  
  124.  {  
  125.  }  
  126. };  
  127. # 63 "Signals.h" 2  
  128. # 75 "Signals.h"  
  129. # 1 "Signal.h" 1  
  130. # 16 "Signal.h"  
  131. template <typename T1, typename T2, typename T3, typename T4, typename T5>  
  132.   
  133. class TSignal5  
  134. {  
  135.   
  136.  typedef TFunction5<void , T1, T2, T3, T4, T5> SigProc;  
  137.   
  138. public:  
  139.   
  140.   
  141.  TSignal5(int maxSlots) :  
  142.    m_numberMax(maxSlots), m_number(0)  
  143.  {  
  144.  }  
  145.   
  146.   
  147.  ~TSignal5()  
  148.  {  
  149.  }  
  150. };  
  151. # 76 "Signals.h" 2  
  152. # 88 "Signals.h"  
  153. # 1 "Signal.h" 1  
  154. # 16 "Signal.h"  
  155. template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>  
  156.   
  157. class TSignal6  
  158. {  
  159.   
  160.  typedef TFunction6<void , T1, T2, T3, T4, T5, T6> SigProc;  
  161.   
  162. public:  
  163.   
  164.   
  165.  TSignal6(int maxSlots) :  
  166.    m_numberMax(maxSlots), m_number(0)  
  167.  {  
  168.  }  
  169.   
  170.   
  171.  ~TSignal6()  
  172.  {  
  173.  }  
  174. };  
  175. # 89 "Signals.h" 2  

其中"# xx xxxxx"是一些说明文字,具体含义可查"gcc -E"的说明,本人也了解甚少,不作解释!


通过这种宏结合模板的方式,将6个模板类通过1个模板类来生成,使代码更加简洁、清晰!


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多