形态 | 说明 | 规则 III |
#define identifier replacement-list (optional) | 仅文本替换 | -- |
#define identifier (parameters ) replacement-list (optional) | 固定参数个数的宏函数 | 参数个数严格匹配 |
#define identifier (parameters , ...) replacement-list (optional) | 部门可变参数个数的宏函数 | 参数个数不能少于已出现的固定参数个数 |
#define identifier (...) replacement-list (optional) | 全可变参数个数的宏函数 | 参数个数不做要求,可为 0 即空参数 |
状态 | 应用宏 |
X0 | 初始 |
X1 | #define X0 X1 |
X2 | #define X1 X2 |
X3 | #define X2 X3 |
X0 | #define X3 X0 |
X0 | 自参照,停止替换 |
状态 | 应用宏 |
X0 | 初始 |
X1 | #define X0 X1 |
X2 | #define X1 X2 |
X3 | #define X2 X3 |
X1 | #define X3 X1 |
X1 | 自参照,停止替换 |
状态 | 应用宏 |
FOO(BAR()) | 初始 |
FOO(bar) | #define BAR bar 且 FOO 的实现没有对参数拼接或取字面量的操作 |
FOO_IMPL(foo_, bar) | #define FOO(SYMBOL) FOO_IMPL(foo_, SYMBOL) |
foo_bar | #define FOO_IMPL(A, B) A##B |
状态 | 应用宏 |
log("%d%f", 2, 1, .2); | 初始 |
printf(“%d%f" PP_COMMA_IF(2) 1, .2); | #define log(format, n, ...) printf(format PP_COMMA_IF(n) __VA_ARGS__) |
printf(“%d%f" PP_IF(2, PP_COMMA(), PP_EMPTY()) 1, .2); | #define PP_COMMA_IF(N) PP_IF(N, PP_COMMA(), PP_EMPTY()) |
printf(“%d%f" PP_IF(2, , , ) 1, .2); | #define PP_COMMA() , 和 #define PP_EMPTY() 且 PP_IF 实现没有对参数 ## & # |
报错 | PP_IF 参数个数不匹配,需要 3 个,实际 4 个 |
状态 | 应用宏 |
log("%d%f", 2, 1, .2); | 初始 |
printf(“%d%f" PP_COMMA_IF(2) 1, .2); | #define log(format, n, ...) printf(format PP_COMMA_IF(n) __VA_ARGS__) |
printf(“%d%f" PP_IF(2, PP_COMMA, PP_EMPTY)() 1, .2); | <source>:20:1: error: macro 'PP_IF_1' passed 3 arguments, but takes just 2 20 | log("%d%f", 2, 1, .2); | ^~~~~~~ <source>:13:9: note: macro 'PP_IF_1' defined here 13 | #define PP_IF_1(THEN, ELSE) THEN | ^~~~~~~ <source>:21:1: error: macro 'PP_IF_0' passed 3 arguments, but takes just 2 21 | log("hello", 0); | ^~~~~~~ <source>:14:9: note: macro 'PP_IF_0' defined here 14 | #define PP_IF_0(THEN, ELSE) ELSE | ^~~~~~~ |
printf(“%d%f" PP_CONCAT(PP_IF_, PP_BOOL(2))(PP_COMMA, PP_EMPTY)() 1, .2); | #define PP_IF(PRED, THEN, ELSE) PP_CONCAT(PP_IF_, PP_BOOL(PRED))(THEN, ELSE) |
printf(“%d%f" PP_CONCAT(PP_IF_, PP_CONCAT(PP_BOOL_, 2))(PP_COMMA, PP_EMPTY)() 1, .2); | #define PP_BOOL(N) PP_CONCAT(PP_BOOL_, N) |
printf(“%d%f" PP_CONCAT(PP_IF_, PP_BOOL_2)(PP_COMMA, PP_EMPTY)() 1, .2); | #define PP_CONCAT(A, B) PP_CONCAT_IMPL(A, B) 和 #define PP_CONCAT_IMPL(A, B) A##B |
printf(“%d%f" PP_CONCAT(PP_IF_, 1)(PP_COMMA, PP_EMPTY)() 1, .2); | #define PP_BOOL_2 1 |
printf(“%d%f" PP_IF_1(PP_COMMA, PP_EMPTY)() 1, .2); | #define PP_CONCAT(A, B) PP_CONCAT_IMPL(A, B) 和 #define PP_CONCAT_IMPL(A, B) A##B |
printf(“%d%f" PP_COMMA() 1, .2); | #define PP_IF_1(THEN, ELSE) THEN |
printf(“%d%f" , 1, .2); | #define PP_COMMA() , |
printf(“%d%f" , 1, .2); | 无可替换符号,结束 |
状态 | 应用宏 |
log("hello", 0); | 初始 |
printf(“hello" PP_COMMA_IF(0) ); | #define log(format, n, ...) printf(format PP_COMMA_IF(n) __VA_ARGS__) |
printf(“hello" PP_IF(0, PP_COMMA, PP_EMPTY)() ); | <source>:20:1: error: macro 'PP_IF_1' passed 3 arguments, but takes just 2 20 | log("%d%f", 2, 1, .2); | ^~~~~~~ <source>:13:9: note: macro 'PP_IF_1' defined here 13 | #define PP_IF_1(THEN, ELSE) THEN | ^~~~~~~ <source>:21:1: error: macro 'PP_IF_0' passed 3 arguments, but takes just 2 21 | log("hello", 0); | ^~~~~~~ <source>:14:9: note: macro 'PP_IF_0' defined here 14 | #define PP_IF_0(THEN, ELSE) ELSE | ^~~~~~~ |
printf(“hello" PP_CONCAT(PP_IF_, PP_BOOL(0))(PP_COMMA, PP_EMPTY)() ); | #define PP_IF(PRED, THEN, ELSE) PP_CONCAT(PP_IF_, PP_BOOL(PRED))(THEN, ELSE) |
printf(“hello" PP_CONCAT(PP_IF_, PP_CONCAT(PP_BOOL_, 0))(PP_COMMA, PP_EMPTY)() ); | #define PP_BOOL(N) PP_CONCAT(PP_BOOL_, N) |
printf(“hello" PP_CONCAT(PP_IF_, PP_BOOL_0)(PP_COMMA, PP_EMPTY)() ); | #define PP_CONCAT(A, B) PP_CONCAT_IMPL(A, B) 和 #define PP_CONCAT_IMPL(A, B) A##B |
printf(“hello" PP_CONCAT(PP_IF_, 0)(PP_COMMA, PP_EMPTY)() ); | #define PP_BOOL_0 0 |
printf(“hello" PP_IF_0(PP_COMMA, PP_EMPTY)() ); | #define PP_CONCAT(A, B) PP_CONCAT_IMPL(A, B) 和 #define PP_CONCAT_IMPL(A, B) A##B |
printf(“hello" PP_EMPTY() 1, .2); | #define PP_IF_0(THEN, ELSE) ELSE |
printf(“hello" ); | #define PP_EMPTY() |
printf(“hello" ); | 无可替换符号,结束 |
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |