[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
最后修改日期: 27 2 月, 2025

作者

留言

撰写回覆或留言