利用gcc -E选项,可以得到预编译后的文件。这可以得到宏展开后的文件。
先来看看几个相关联的文件吧!
- #ifndef __DEFS_H__
- #define __DEFS_H__
-
- #ifdef WIN32
- #define snprintf _snprintf
- #endif
-
- // Join two variables
- #define MACRO_JOIN( X, Y ) MACRO_DO_JOIN( X, Y )
- #define MACRO_DO_JOIN( X, Y ) MACRO_DO_JOIN2(X,Y)
- #define MACRO_DO_JOIN2( X, Y ) X##Y
-
- #endif //__DEFS_H__
- // Signal.h(宏定义的模板类)
-
- /// \class SIGNAL_SIGNAL
- /// \brief 信号类模块。
- ///
- /// 一个信号被触发时,会调用所有连接到其上的TFunctionN对象,只支持
- /// 返回值为void的TFunctionN。SIGNAL_SIGNAL是一个宏,根据参数个数会被替换成
- /// TSignalN,用户通过 TSignalN<T1, T2, T3,..,TN>方式来使用,TN表示参数类型,
- /// N表示函数参数个数,目前最大参数为6。
- /// \see FUNCTION_FUNCTION
-
- #define SIGNAL_SIGNAL MACRO_JOIN(TSignal,SIGNAL_NUMBER)
- #define FUNCTION_FUNCTION MACRO_JOIN(TFunction, SIGNAL_NUMBER)
-
- #include "Defs.h"
-
- #if (SIGNAL_NUMBER != 0)
- template <SIGNAL_CLASS_TYPES>
- #endif
- class SIGNAL_SIGNAL
- {
- /// 与信号模板参数类型匹配的函数指针对象类型
- typedef FUNCTION_FUNCTION<void SIGNAL_TYPES_COMMA> SigProc;
-
- public:
- /// 构造函数
- /// \param maxSlots 能够连接的最大函数指针对象的个数
- SIGNAL_SIGNAL(int maxSlots) :
- m_numberMax(maxSlots), m_number(0)
- {
- }
-
- /// 析构函数
- ~SIGNAL_SIGNAL()
- {
- }
- };
-
- #undef SIGNAL_SIGNAL
- #undef FUNCTION_FUNCTION
- // Signals.h(最终生成的6个模板类)
-
- #ifndef __INIFRA_SIGNALS_H__
- #define __INIFRA_SIGNALS_H__
-
- //TSignal0
- #define SIGNAL_NUMBER 0
- #define SIGNAL_CLASS_TYPES void
- #define SIGNAL_TYPES_COMMA
- #define SIGNAL_TYPE_ARGS void
- #define SIGNAL_ARGS
- #include "Signal.h"
- #undef SIGNAL_NUMBER
- #undef SIGNAL_CLASS_TYPES
- #undef SIGNAL_TYPES_COMMA
- #undef SIGNAL_TYPE_ARGS
- #undef SIGNAL_ARGS
-
- //TSignal1
- #define SIGNAL_NUMBER 1
- #define SIGNAL_CLASS_TYPES typename T1
- #define SIGNAL_TYPES_COMMA , T1
- #define SIGNAL_TYPE_ARGS T1 a1
- #define SIGNAL_ARGS a1
- #include "Signal.h"
- #undef SIGNAL_NUMBER
- #undef SIGNAL_CLASS_TYPES
- #undef SIGNAL_TYPES_COMMA
- #undef SIGNAL_TYPE_ARGS
- #undef SIGNAL_ARGS
-
- //TSignal2
- #define SIGNAL_NUMBER 2
- #define SIGNAL_CLASS_TYPES typename T1, typename T2
- #define SIGNAL_TYPES_COMMA , T1, T2
- #define SIGNAL_TYPE_ARGS T1 a1, T2 a2
- #define SIGNAL_ARGS a1, a2
- #include "Signal.h"
- #undef SIGNAL_NUMBER
- #undef SIGNAL_CLASS_TYPES
- #undef SIGNAL_TYPES_COMMA
- #undef SIGNAL_TYPE_ARGS
- #undef SIGNAL_ARGS
-
- //TSignal3
- #define SIGNAL_NUMBER 3
- #define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3
- #define SIGNAL_TYPES_COMMA , T1, T2, T3
- #define SIGNAL_TYPE_ARGS T1 a1, T2 a2, T3 a3
- #define SIGNAL_ARGS a1, a2, a3
- #include "Signal.h"
- #undef SIGNAL_NUMBER
- #undef SIGNAL_CLASS_TYPES
- #undef SIGNAL_TYPES_COMMA
- #undef SIGNAL_TYPE_ARGS
- #undef SIGNAL_ARGS
-
- //TSignal4
- #define SIGNAL_NUMBER 4
- #define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3, typename T4
- #define SIGNAL_TYPES_COMMA , T1, T2, T3, T4
- #define SIGNAL_TYPE_ARGS T1 a1, T2 a2, T3 a3, T4 a4
- #define SIGNAL_ARGS a1, a2, a3, a4
- #include "Signal.h"
- #undef SIGNAL_NUMBER
- #undef SIGNAL_CLASS_TYPES
- #undef SIGNAL_TYPES_COMMA
- #undef SIGNAL_TYPE_ARGS
- #undef SIGNAL_ARGS
-
- //TSignal5
- #define SIGNAL_NUMBER 5
- #define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3, typename T4, typename T5
- #define SIGNAL_TYPES_COMMA , T1, T2, T3, T4, T5
- #define SIGNAL_TYPE_ARGS T1 a1, T2 a2, T3 a3, T4 a4, T5 a5
- #define SIGNAL_ARGS a1, a2, a3, a4, a5
- #include "Signal.h"
- #undef SIGNAL_NUMBER
- #undef SIGNAL_CLASS_TYPES
- #undef SIGNAL_TYPES_COMMA
- #undef SIGNAL_TYPE_ARGS
- #undef SIGNAL_ARGS
-
- //TSignal6
- #define SIGNAL_NUMBER 6
- #define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3, typename T4, typename T5, typename T6
- #define SIGNAL_TYPES_COMMA , T1, T2, T3, T4, T5, T6
- #define SIGNAL_TYPE_ARGS T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6
- #define SIGNAL_ARGS a1, a2, a3, a4, a5, a6
- #include "Signal.h"
- #undef SIGNAL_NUMBER
- #undef SIGNAL_CLASS_TYPES
- #undef SIGNAL_TYPES_COMMA
- #undef SIGNAL_TYPE_ARGS
- #undef SIGNAL_ARGS
-
- #endif //__SIGNALS_H__
通过gcc -E 选项,我们对Signals.h进行预编译,即可得到宏展开后的文件,内容如下:
- # 1 "Signals.h"
- # 1 "<command-line>"
- # 1 "Signals.h"
- # 10 "Signals.h"
- # 1 "Signal.h" 1
- # 13 "Signal.h"
- # 1 "Defs.h" 1
- # 14 "Signal.h" 2
-
-
-
-
- class TSignal0
- {
-
- typedef TFunction0<void > SigProc;
-
- public:
-
-
- TSignal0(int maxSlots) :
- m_numberMax(maxSlots), m_number(0)
- {
- }
-
-
- ~TSignal0()
- {
- }
- };
- # 11 "Signals.h" 2
- # 23 "Signals.h"
- # 1 "Signal.h" 1
- # 16 "Signal.h"
- template <typename T1>
-
- class TSignal1
- {
-
- typedef TFunction1<void , T1> SigProc;
-
- public:
-
-
- TSignal1(int maxSlots) :
- m_numberMax(maxSlots), m_number(0)
- {
- }
-
-
- ~TSignal1()
- {
- }
- };
- # 24 "Signals.h" 2
- # 36 "Signals.h"
- # 1 "Signal.h" 1
- # 16 "Signal.h"
- template <typename T1, typename T2>
-
- class TSignal2
- {
-
- typedef TFunction2<void , T1, T2> SigProc;
-
- public:
-
-
- TSignal2(int maxSlots) :
- m_numberMax(maxSlots), m_number(0)
- {
- }
-
-
- ~TSignal2()
- {
- }
- };
- # 37 "Signals.h" 2
- # 49 "Signals.h"
- # 1 "Signal.h" 1
- # 16 "Signal.h"
- template <typename T1, typename T2, typename T3>
-
- class TSignal3
- {
-
- typedef TFunction3<void , T1, T2, T3> SigProc;
-
- public:
-
-
- TSignal3(int maxSlots) :
- m_numberMax(maxSlots), m_number(0)
- {
- }
-
-
- ~TSignal3()
- {
- }
- };
- # 50 "Signals.h" 2
- # 62 "Signals.h"
- # 1 "Signal.h" 1
- # 16 "Signal.h"
- template <typename T1, typename T2, typename T3, typename T4>
-
- class TSignal4
- {
-
- typedef TFunction4<void , T1, T2, T3, T4> SigProc;
-
- public:
-
-
- TSignal4(int maxSlots) :
- m_numberMax(maxSlots), m_number(0)
- {
- }
-
-
- ~TSignal4()
- {
- }
- };
- # 63 "Signals.h" 2
- # 75 "Signals.h"
- # 1 "Signal.h" 1
- # 16 "Signal.h"
- template <typename T1, typename T2, typename T3, typename T4, typename T5>
-
- class TSignal5
- {
-
- typedef TFunction5<void , T1, T2, T3, T4, T5> SigProc;
-
- public:
-
-
- TSignal5(int maxSlots) :
- m_numberMax(maxSlots), m_number(0)
- {
- }
-
-
- ~TSignal5()
- {
- }
- };
- # 76 "Signals.h" 2
- # 88 "Signals.h"
- # 1 "Signal.h" 1
- # 16 "Signal.h"
- template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
-
- class TSignal6
- {
-
- typedef TFunction6<void , T1, T2, T3, T4, T5, T6> SigProc;
-
- public:
-
-
- TSignal6(int maxSlots) :
- m_numberMax(maxSlots), m_number(0)
- {
- }
-
-
- ~TSignal6()
- {
- }
- };
- # 89 "Signals.h" 2
其中"# xx xxxxx"是一些说明文字,具体含义可查"gcc -E"的说明,本人也了解甚少,不作解释!
通过这种宏结合模板的方式,将6个模板类通过1个模板类来生成,使代码更加简洁、清晰!
|