专题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)#运算符用于在预编译期将宏参数转换为字符串
#运算符在宏中的妙用
##运算符
##运算符用于在预编译期粘连两个符号
利用##定义结构体类型
晦涩
相关文章推荐
- C#专题之C#的编译、文法及预处理
- C语言程序设计教程笔记_编译预处理
- C 预处理(宏定义,文件包含,条件编译)
- 嵌入式开发之C基础学习笔记07--编译预处理
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
- 编译时标签(对JSP进行的XSLT预处理)
- C语言的编译预处理
- 第九讲:编译预处理命令
- C/C++程序编译流程(预处理->编译->汇编->链接)
- C语言编译预处理技术一本道来
- GCC编译的背后( 预处理和编译 汇编和链接 )
- 【C语言】编译预处理及宏定义
- C/C++编译预处理:宏定义指令、文件包含指令、条件编译指令和特殊符号处理
- c/c++预处理过程详解(二)之条件编译及预定义的宏
- 编译预处理
- C++程序设计必知:多文件结构和编译预处理命令
- 程序的处理步骤-------预处理、编译、链接、运行
- C语言基础之编译预处理及位运算
- 预处理,编译, 优化, 汇编, 链接
- 编译预处理命令define