[toc]
概述
程序的生成过程:
- 预编译(处理宏。.i或者.ii 文件)
- 编译(元编程代码处理,模板的实例化,其他代码的编译。.s文件)
- 汇编(汇编语言代码处理,生成二进制目标文件。.o文件)
- 链接(将编译生成的符号,跟定义进行合并,可执行文件)
在程序预处理阶段将宏替换成定义的内容。本质是内容的替换。
常用指令
指令 | 说明 |
---|---|
#include | 包含一个源文件代码 |
#define, #undef | 定义/取消一个宏 |
#ifdef , #ifndef | 如果宏(没有)定义,返回真,并开始一个条件编译块 |
#if, #else, #elif | 定义一个条件编译块 |
#endif | 结束一个条件编译块 |
#error | 输出错误消息,编译会中断 |
#pragma | 可向编译器发出特殊命令,控制编译 |
用法
- 通常为大写
- 通常作为静态配置参数,可以让编译好的程序有不同的行为
- 宏和条件编译配合,可以静态调整程序模块,逻辑流程等。
- 参数宏是代码替换,可能引起二进制代码的体积增大。
- 配合预定义,可以实现很灵活的功能。
基本参数定义
宏函数
特殊符号定义
#:字符串化操作符(Stringizing Operator)
字符串化操作符,将宏参数转换为一个字符串。通常在预编译时候,生成包含宏参数值的字符串。
#define TO_STRING(STR) #STR
##:连接符(Token-Pasting Operator)
##
符号用于连接两个标记(token)成一个标记。这在宏定义中特别有用,它允许你创建具有动态名称的变量或者函数。
#define CONCAT(X, Y) X##Y
int CONCAT(part1, part2) = 42; // int part1part2 = 42;
#@:字符化操作符(Charizing)
作用:将传入单字符参数名转换成字符,以一对单引用括起来。
#define CHAR(C) #@C
char ch = CHAR(T); // char ch = 'T';
\:续行符号
当定义的宏不能用一行表达完整时,可以用\
表示下一行继续此宏的定义。注意\
前留空格。
#define EXAMPLE \
example
留言