gcc -E 产生预编译后的文件
生活随笔
收集整理的這篇文章主要介紹了
gcc -E 产生预编译后的文件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
利用gcc -E選項,可以得到預(yù)編譯后的文件。這可以得到宏展開后的文件。
先來看看幾個相關(guān)聯(lián)的文件吧!
#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 信號類模塊。 /// /// 一個信號被觸發(fā)時,會調(diào)用所有連接到其上的TFunctionN對象,只支持 /// 返回值為void的TFunctionN。SIGNAL_SIGNAL是一個宏,根據(jù)參數(shù)個數(shù)會被替換成 /// TSignalN,用戶通過 TSignalN<T1, T2, T3,..,TN>方式來使用,TN表示參數(shù)類型, /// N表示函數(shù)參數(shù)個數(shù),目前最大參數(shù)為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 {/// 與信號模板參數(shù)類型匹配的函數(shù)指針對象類型typedef FUNCTION_FUNCTION<void SIGNAL_TYPES_COMMA> SigProc;public:/// 構(gòu)造函數(shù)/// \param maxSlots 能夠連接的最大函數(shù)指針對象的個數(shù)SIGNAL_SIGNAL(int maxSlots) :m_numberMax(maxSlots), m_number(0){}/// 析構(gòu)函數(shù)~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進行預(yù)編譯,即可得到宏展開后的文件,內(nèi)容如下:
# 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"的說明,本人也了解甚少,不作解釋!
通過這種宏結(jié)合模板的方式,將6個模板類通過1個模板類來生成,使代碼更加簡潔、清晰!
總結(jié)
以上是生活随笔為你收集整理的gcc -E 产生预编译后的文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 力登:以智能化管理提升数据中心服务能力成
- 下一篇: 谈大数据也谈人工智能 郭为告诉你一个不一