您的位置:首页 > 其它

专题3-编译预处理

2017-01-05 23:02 134 查看

定义宏常量

#define宏常量可以出现在任何地方
#define从本行开始,之后的代码都可以使用这个宏常量



都是对的,最后一个是接续符

#define表达式给有函数调用的假象,却不是函数。
#define表达式可以比函数更加强大。
#define表达式比函数更容易出错。





函数里面的array只能是指针,而宏定义是代表整个数组

宏强于函数的优势,实例。



可以扩展C语言的用法

宏表达式与函数的对比
(1)宏表达式在预编译期被处理,编译器不知道宏表达式的存在。
(2)宏表达式用“实参”完全代替形参,不进行任何运算
(3)宏表达式没有任何的“调用”开销
(4)宏表达式中不能出现递归定义





宏定义可以出现在代码的任何位置,并且在宏定义之后,在代码的任何地方都可以调用这个宏。





定义日志宏





用函数调用实现有问题,打印的是调用处的行号





打印时间,用函数



用宏




条件编译使用分析

基本概念
(1)条件编译的行为类似于C语言中的if...else
(2)条件编译是预编译指示命令,用于控制是否编译某段代码



最后结果一样,中间不同





编译预处理中间只能存在一条printf
后面的两个printf都是存在的,按照条件选择哪一个printf

#include的困惑
(1)#include的本质是将已经存在的文件内容嵌入到当前文件中
(2)#include的间接包含同样会产生嵌入文件 内容的动作



#ifndef    
#define
#endif

条件编译的意义
(1)条件编译使得我们可以按照不同条件编译不同代码段,因而可以产生不同的目标代码
(2)#if #else #endif被预编译期处理;而if ...else语句被编译器处理,必然被编译进目标代码
(3)实际工程中条件编译主要用于以下两种情况:不同产品线公用一段代码;区分编译产品的调试版和发布版。



gcc -D ......   在命令中定义宏

小结
(1)通过编译器命令行能够定义预处理器使用的宏
(2)条件编译可以避免重复包含同一头文件
(3)条件编译是在工程开发中可以区别不同产品线的代码
(4)条件编译可以定义产品的发布版和调试版  

#error和#line

#error的用法
(1)#error用于生成一个编译错误信息,并停止编译
(2)用法    #error message     注:message不需要用双引号包围
(3)#error编译指示字用于自定义程序员特有的编译错误消息,类似的#warning用于生成编译警告,但不会停止编译。





不能生成中间文件,error和warning是程序员自己编译器的错误系统的,根据我们所需要满足的条件,根据项目和工程自定义扩展的一个编译错误系统



#error和warning的使用,自定义错误信息

#line的用法
#line用于强制指定新的行号和编译文件名,并对源程序的代码重新编号
用法
#line number filename
注:filename可省略
#line 编译指示字的本质是重定义_LINE_和_FILE_







#pragma预处理分析

#pragma简介
(1)#pragma是编译器指示字,用于指示编译器完成一些特定的动作。
(2)#pragma所定义的很多指示字是编译器和操作系统所特有的。
(3)#pragma在不同的编译器间是不可移植的:预处理器将忽略它不认识的#pragma指令;两个不同的编译器可能以两种不同的方式解释同一条#pragma指令。
一般用法:#pragma parameter
注:不同的parameter参数语法和意义各不相同 

#pragma message
(1)message参数在大多数的编译器中都有相似的实现。
(2)message参数在编译时输出消息到编译输出窗口中。
(3)message可用于代码的版本控制。
注意:message是VC特有的编译器指示字,GCC将其忽略。
error和warning是在程序出现错误时出现信息,message是单纯的将消息输出出来

#pragma在不同编译器下的事例





代码可移植,编译行为不可移植

#pragma pack

什么是内存对齐?

不同类型的数据在内存中按照一定的规则排列;而不是顺序的一个接一个的排放,这就是对齐。





左边告诉编译器以两个字节对齐,右边是以4个字节对齐。











内存对齐可以用一句话来概括:

“数据项只能存储在地址是数据项大小的整数倍的内存位置上”
http://blog.csdn.net/andy572633/article/details/7213465 http://www.jb51.net/article/44221.htm


#和##运算符

#运算符
(1)#运算符用于在预编译期将宏参数转换为字符串



#运算符在宏中的妙用



##运算符
##运算符用于在预编译期粘连两个符号





利用##定义结构体类型



晦涩



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: