gcc -E 产生预编译后的文件

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 在React中我们怎么做静态类型检测?都有哪些方法可以做到?

[react] 在React中我们怎么做静态类型检测&#xff1f;都有哪些方法可以做到&#xff1f; flow 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

STM32F4 使用STLink 和 EventRecoder 调试运行时间

最近使用STM32F407的DSP库&#xff0c;测试了一下浮点数1024个点的FFT计算时间&#xff0c;采用EventRecoder计时间&#xff0c;记录如下。 1、在Compiler中添加EventRecorder 组件&#xff0c;CMSIS的版本5.4。 2、main.C增加头文件&#xff1a;#include "EventRecorder…

道德经经典解读

老子说&#xff1a;上善若水。水善利万物而不争。 原著实录 《道德经》第8章&#xff1a;上善若水。水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道。居善地&#xff0c;心善渊&#xff0c;与善仁&#xff0c;言善信&#xff0c;政善治&#xff0c;事善能&…

_attribute_((packed))

From: http://blog.csdn.net/wesleyluo/article/details/7565165 _attribute_((packed)) 1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐&#xff0c;是GCC特有的语法。这个功能是跟操作系统没关系&#xff0…

制作centos安装u盘

制作centos安装u盘 格式化 mkfs.vfat /dev/sdb1 制作 dd ifCentOS-7-x86_64-Minimal-1503-01.iso of/dev/sdb # 1. 注意是/dev/sdb 不是/dev/sdb1 # 2. bios中将硬盘设置为AHCI模式 posted on 2015-10-23 11:28 北京涛子 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnb…

[react] 怎么在JSX里属性可以被覆盖吗?覆盖的原则是什么?

[react] 怎么在JSX里属性可以被覆盖吗&#xff1f;覆盖的原则是什么&#xff1f; 会被覆盖&#xff0c;类似Object.assign&#xff0c;后面的覆盖前面的 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨…

Keil5 EventRecorder 的STDOUT输出丢包率较大现象

采用STLINK EventRecorder 对printf进行重定义&#xff0c;在连续发送数据时&#xff0c;存在较大的丢包情况。因此&#xff0c;调试小数据量时可以采用这种方法&#xff0c;大数据量的时候还是直接用UART 进行输出。

使用 C++ 处理 JSON 数据交换格式

From: http://blog.csdn.net/xt_xiaotian/article/details/5648388 使用 C 处理 JSON 数据交换格式 一、摘要 JSON 的全称为&#xff1a;JavaScript Object Notation&#xff0c;顾名思义&#xff0c;JSON 是用于标记 Javascript 对象的&#xff0c;JSON 官方的解释为&#x…

Etherchannel的配置 三层

三层以太网通道 interface FastEthernet0/19 no switchport no ip address channel-protocol lacp channel-group 30 mode active ! interface FastEthernet0/20 no switchport no ip address channel-protocol lacp channel-group 30 mode active interface Port-chan…

[react] immutable的原理是什么

[react] immutable的原理是什么 使用字典树持久化数据结构&#xff0c;更新时可优化对象生成逻辑&#xff0c;降低成本 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面…

CubeMx 生成的FreeRTOS 代码在ARM compiler6 编译__forceinline 报错的解决方法

一、问题 如题&#xff0c;CubeMx 生成的FreeRTOS 代码在ARM compiler6 编译__forceinline 报错的解决方法。 二、解决方法 第一种方法&#xff0c;将编译器换回default compiler version 5。 第二种方法&#xff0c;更换freeRTOS移植源码文件。 将FreeRTOS源码xxx\FreeRTOS…

解决centos KDE命令提示符和文字不紧贴的问题

注意此时cd后面是没有空格的但此时却显示像有空格的一样&#xff0c;要解决这个问题就需要修改PS1 在自己的home的目录下更改.bashrc 例如root就在/root下 PS1"\e[1;32m\u\e[m\e[1;33m\e[m\e[1;35m\h\e[m:\w\$ "转载于:https://www.cnblogs.com/597845634ds/p/490557…

UPS电源远程关机

UPS电源的APC软件是个单机PowerChute Business Edition 的&#xff0c;一个UPS电源上也不是一台服务器&#xff0c;如何在停电的时候把其它服务器也关了&#xff0c;难不成再去买网络版。Windows从xp以上就可以远程关机了&#xff0c;shutdown命令。PowerChute是以系统服务在后…

[react] 什么是React的实例?函数式组件有没有实例?

[react] 什么是React的实例&#xff1f;函数式组件有没有实例&#xff1f; React的实例&#xff1a;通过继承React.Component的类生成 函数式组件没有实例 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一…

安卓dalvik和art区别

Dalvik模式像是一台折叠自行车&#xff0c;每次骑之前都要组装后才能上路。而ART模式就是一个已经装好的自行车&#xff0c;直接就能上车走人。所以ART模式在效率上肯定是要好于Dalvik。 通过以上这种表格&#xff0c;我们可以直白的看出&#xff0c;全新的ART模式具备用RAM内存…

STM32 FreeRTOS USART DMA空闲中断和消息队列的使用

&#xff08;后文有修改&#xff09; 一、思路 USARTDMA空闲中断发生后&#xff0c;将接收到的DMA消息用消息队列发出去xQueueSendToFrontFromISR&#xff0c;FreeRTOS创建一个独立的任务一直等待接受消息队列。 DMA中断可以被FreeRTOS管理。 二、CubeMx配置驱动 2.1 USAR…

Samba服务全攻略

From: http://redking.blog.51cto.com/27212/120934 1 Samba原理 1.1 Samba概述 接触Linux我们听的最多的就是Samba服务&#xff0c;为什么Samba应用这么广泛哈~&#xff0c;原因是Samba最先在Linux和Windows两个平台之间架起了一座桥梁哈&#xff0c;正是由于Samba的出现&am…

VS2008 JS调试和Silverlight 后台代码调试 相互影响的问题。---自己做实例证明

但是有几点要注意。首先&#xff0c;不能在同一调试过程中调试托管代码和脚本。&#xff08;即XAML。cs 和JAVASCRIPT&#xff09; 这就是说&#xff0c;如果在XAML的隐藏代码中设置一个断点&#xff0c;并且已经打开了Silverlight调试&#xff0c;那么断点将发挥相应的作用然而…

[react] 如何提高组件的渲染效率呢?

[react] 如何提高组件的渲染效率呢&#xff1f; 类组件&#xff1a; 1、继承PureComponent 2、使用shouldComponentUpdate优化 函数组件&#xff1a; 1、memo模拟PureComponent 2、使用useMemo缓存变量 3、使用useCallback缓存函数 循环添加key,key最好用数组项的唯一值&…

FreeRTOS 任务间同步和通信方法

以下在CMSIS V2代码下实现&#xff0c;不区分是否中断安全。 1、信号量 semaphores /* Definitions for adcFinishedBinSem */ osSemaphoreId_t adcFinishedBinSemHandle; const osSemaphoreAttr_t adcFinishedBinSem_attributes {.name "adcFinishedBinSem" };/…