预处理指令
在一个程序的编译过程中,分为四个阶段,即预处理、编译、汇编、链接。
预处理过程中,会处理所有的指令(以“#”开头的语句),替换为纯C的语法。
下面列举一些常用的预处理指令。
#define | 定义宏 |
#elif | else if 多选分支 |
#else | 与#if #ifndef #ifdef结合使用 |
#error | 产生错误,挂起预处理程序 |
#if | 判断 |
#endif | 结束判断 |
#ifdef | 判断宏是否定义 |
#ifndef | 判断宏是否没有被定义 |
#include | 将指定文件插入“#include”的位置 |
#include_next | 与#include一样,但从当前目录之后的目录查找 |
#line | 指定行号 |
#pragma | 提供额外信息的标准方法,可用来指定平台 |
#undef | 删除宏 |
#warning | 创建一个警告 |
## | 连接操作符,用于宏内连接两个字符串 |
1、pargma 基础用法
1.1 #pragma GCC dependency “hello.c”
如果“hello.c”文件被更新,则会产生警告。
1.2 #pragma GCC poison goto
禁用“#pragma GCC poison”后的操作符,这里是禁止使用goto
1.3 #pragma pack(int)
这个决定结构的对齐与补齐
对齐:指每个成员必须放在自己大小的整数倍位置(大于4字节按4字节算)
补齐:指每个结构的大小应该是最大成员的整数倍(大于4字节的按4字节算)
之所以进行对齐和补齐,是为了加快寻址,但是会浪费空间,可以使用这个指令来改变对齐和补齐的单元,如:
#pragma pack(1) 按1字节进行对齐和补齐,即不做对齐和补齐。
#pragma pack(2) 按2字节的整数倍对齐和补齐。