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

gcc -E 产生预编译后的文件相关推荐

  1. RT-Thread中如何预编译一个.c文件

    本文介绍在RT-Thread系统,使用scons,如何预编译一个.c文件 首先新建一个测试文件test.c #include "rtthread.h"void test(void) ...

  2. JAVA编译成文件的说法_下列关于使用Javac命令编译后生成文件的说法中,正确的是?...

    下列关于使用Javac命令编译后生成文件的说法中,正确的是? 答:编译后生成的文件可以在Java虚拟机中运行\n\n编译后生成的文件为二进制文件\n\n编译后生成文件的后缀名为.class 线性表的链 ...

  3. IDEA解决Maven项目编译后classes文件中没有.xml或.properties问题

    IDEA解决Maven项目编译后classes文件中没有.xml或.properties问题 方式一.在 pom.xml 中添加下面的代码 <build><!--解决Maven项目编 ...

  4. python源代码程序编译后的文件扩展名是什么_Python源代码程序编译后的文件扩展名为_________。...

    Python源代码程序编译后的文件扩展名为_________. 答:pyc 某合同价格条款规定如下:"每打FOB上海15欧元,总值4500欧元".则此时欧元为 答:计价货币 生态文 ...

  5. python程序文件的扩展名称-Python源代码程序编译后的文件扩展名为( )。_学小易找答案...

    [单选题]9.药物与血浆蛋白结合后( ). [填空题]根据ISO标准,当刀具中心轨迹在程序轨迹前进方向左边时称为左刀补,用( )指令表示! [判断题]进口的农产品必须按照国家规定的农产品质量安全标准进 ...

  6. gcc——预处理(预编译),编译,汇编,链接

    一,预编译 操作步骤:gcc -E hello.c -o hello.i 主要作用: 处理关于 "#" 的指令 [1]删除#define,展开所有宏定义.例#define port ...

  7. c语言源程序连接后生成,c语言源程序经过编译后,生成文件的后缀是什么?_后端开发...

    c语言如何求n个数的平均值?_后端开发 c语言求n个数平均值的方法:1.定义一个数组存放n个数,然后将数组中的数相加求和.2.用得到的求和结果除以n(数组中数字的个数)即可. C语言源文件后缀名是.c ...

  8. 如何修改被编译后DLL文件

    我们平时在工作中经常会遇到一些已经被编译后的DLL,而且更加麻烦是没有源代码可以进行修改,只能针对这个DLL的文件进行修改才能得到我们想要的结果:本文将通过一个实例来演示如果完成一个简单的修改;我们将 ...

  9. 从RDA5981A/B/C编译后map文件和datasheet分析内存分配情况

    先查看RDA5981的datasheet, 如下图,RDA5981芯片内部有三个RAM区域, I_SRAM,D_SRAM,I_cache, 还可以外挂PSRAM, 内存映射图解释: 在编译目录BUIL ...

最新文章

  1. mysql常见内置函数_MySQL常用内置函数
  2. UICollectionView详解
  3. Dropout的前世与今生
  4. SAP Spartacus 最后渲染出的页面和后台 CMS 页面元数据的一一对应
  5. CityEngine Web Scene如何在IIS下部署
  6. WinSock I/O 模型 -- OVERLAPPED I/O 模型
  7. pip安装指定版本包
  8. 一次Nginx负载均衡的安装与配置
  9. Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
  10. VC下Debug 和Release 区别【转】
  11. BZOJ3172lg3966 TJOI单词(广义后缀自动机)
  12. Python:time库使用方法
  13. Nginx+keepalived高可用配置实战
  14. php怎么用redisson,Redis中RedisTemplate和Redisson管道的使用
  15. 【RobotStudio学习笔记】(一)软件的安装与初步测试
  16. php 微信 爬虫 源码,【程序源代码】微信爬虫
  17. 如何查看自己的外网 IP 地址
  18. 手把手教你写软件1.软件介绍已经心得体会
  19. 树莓派cm3+的i2c使用总结
  20. Angular在页面加载很慢的时候,会出现双花括号的问题

热门文章

  1. [WCF安全系列]绑定、安全模式与客户端凭证类型:NetNamedPipeBinding、NetTcpBinding与NetMsmqBinding...
  2. 列举网络芳邻的网络资源
  3. 关系型数据库的核心单元是_核中的数据关系
  4. 数据可视化工具_数据可视化
  5. python 插补数据_python 2020中缺少数据插补技术的快速指南
  6. 机器学习实践三---神经网络学习
  7. 高版本(3.9版本)python在anaconda安装opencv库及skimage库(scikit_image库)诸多问题解决办法
  8. 最后期限 软件工程_如何在软件开发的最后期限内实现和平
  9. 如何在React Native中使用Redux Saga监视网络更改
  10. python 面试问题_值得阅读的30个Python面试问题