【C】宏定义和宏展开

张开发
2026/4/11 2:51:54 15 分钟阅读

分享文章

【C】宏定义和宏展开
一个较长的宏定义可以分成若干行这需要在待续的行末尾加上一个反斜杠符”\“#define TUP_ASSERT(__expression) do {\ if (!( __expression )) \ { \ SYSLOG_LEGACY(EAaSysLogSeverityLevel_Error,TUP ASSERTION FAILED (%s) file: %s line:%u, #__expression,__FILE__, __LINE__); \ AaErrorAssertion(#__expression,__FILE__, __LINE__); \ } \ } while(0)在替换文本中参数名以#作为前缀则结果将被扩展为由实际参数替换该参数的带引号的字符串#define dprint(expr) printf(#expr %g\n, expr)使用语句dprint(x/y),该宏将被扩展为printf(x/y %g\n, x/y);预处理运算符##为宏展开提供参数连接的作用#define paste(front, back) front##back宏调用paste(name, 1)的结果将建立记号name1宏展开的顺序大致归结为实参替换形参将实参代入宏文本中如果参数是宏则进一步展开直到完全展开。如果参数前后有#或者##则不再展开继续处理替换后的宏文本如果仍包含宏则继续展开例1#define cat(a, b) a##b宏调用cat(cat(1, 2), 3)的展开顺序为cat(cat(1, 2), 3) -- cat(1, 2)##3 -- cat(1, 2)3cat(1, 2)仍是宏但后面是##不再展开结果为cat(1, 2)3。先用实参替换形参然后再判断有没有##然后再判断实参是不是宏。例2#define cat(a, b) a##b #define xcat(x, y) cat(x, y)宏调用 xcat(cat(1, 2), 3)的展开顺序为xcat(cat(1, 2), 3) -- cat(cat(1, 2), 3) -- cat(1##2, 3) -- 1##2##3 -- 123虽然在例2中也生成了cat(cat(1, 2), 3)但已经处于宏展开的第二步参数是宏优先处理参数。

更多文章