利用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" 2class 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个模板类来生成,使代码更加简洁、清晰!