宏
- _LINE_ 表示正在编译的文件的行号
- _FILE_ 表示正在编译的文件的名字
- _DATE_ 表示编译时刻的日期字符串,例如: "25 Dec 2007"
- _TIME_ 表示编译时刻的时间字符串,例如: "12:30:55"
- _STDC_ 判断该文件是不是定义成标准 C 程序
- 宏名的书写由标识符与两边各二条下划线构成
- #define PI 3.141592654
- const 修饰的不是常量而是 readonly 的变量,const 修饰的只读变量不能用来作为定义数组的维数, 也不能放在 case 关键字后面。
- #define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3 路径使用双 反斜杠 单\ 表示连接符
- 宏的生命周期从#define 开始到#undef 结束
条件编译
- 条件编译的功能使得我们可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。
- 条件编译有三种形式
文件包含
- 文件包含是将多个源文件链接形成一个源文件进行编译,形成一个目标文件
- #include<> 预处理到 系统规定的路径中去获得这个文件(即 C 编译系统所提供的并存放在指定的子目录下的头 文件)。找到文件后,用文件内容替换该语句
- filename 为要包含的文件名称。双引号表示预处理应在当前目录中查找文件名为 filename 的文件,若没有找到,则按系统指定的路径信息,搜索其他目录。找到文件后,用 文件内容替换该语句。
- 需要强调的一点是:#include 是将已存在文件的内容嵌入到当前文件中。 另外关于#include 的路径也有点要说明:include 支持相对路径,格式如 trackant(蚁迹寻
踪)所写: .代表当前目录,..代表上层目录。
#error预处理
- #error 预处理指令的作用是,编译程序时,只要遇到 #error 就会生成一个编译错误提 示消息,并停止编译。
- 其语法格式为: #error error-message
- 注意,宏串 error-message 不用双引号包围。遇到#error 指令时,错误信息被显示,可能同时 还显示编译程序作者预先定义的其他内容。关于系统所支持的 error-message 信息,请查找 相关资料
#line处理
- #line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符 命令的基本形式如下:
- #line number["filename"] 其中[]内的文件名可以省略 #line 30 a.h 其中,文件名 a.h 可以省略不写。
- 这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号 为 30,文件名是 a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译 器的编写中,我们知道编译器对 C 源码编译过程中会产生一些中间文件,通过这条指令, 可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。
#pragma
- #pragma 指令可能是最复杂的了,它的作用是设定编译器的 状态或者是指示编译器完成一些特定的动作。#pragma 指令对每个编译器给出了一个方法, 在保持与 C 和 C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译 指示是机器或操作系统专有的,且对于每个编译器都是不同的。
- 其格式一般为: #pragma para 其中 para 为参数,下面来看一些常用的参数。
#pragma message
- message 参数:Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。
- 其使用方法为: #pragma message(“消息文本”)
- 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有 正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判 断自己有没有在源代码的什么地方定义了_X86 这个宏可以用下面的方法
内存对齐
- 利用#pragma pack()来改变编译器的默认对齐方式
- 使用指令#pragma pack (n),编译器将按照 n 个字节对齐。
- 使用指令#pragma pack (),编译器将取消自定义字节对齐方式。 在#pragma pack (n)和#pragma pack ()之间的代码按 n 个字节对齐。
- 但是,成员对齐有一个重要的条件,即每个成员按自己的方式对齐.也就是说虽然指定了 按 n 字节对齐,但并不是所有的成员都是以 n 字节对齐。其对齐的规则是,每个成员按其类型 的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是 n 字节)中较小的一个对齐,即: min( n, sizeof( item )) 。并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空 字节。
- 注意事项
#
- 在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转 化为字符串
##运算符
- 和#运算符一样,##运算符可以用于宏函数的替换部分。这个运算符把两个语言符号组合成单个语言符号