学习宏编程
这里细节
#define 宏删括(T) 宏删括_ T
//如果T有括号,自动就删除了.
#define 宏删括_(...) __VA_ARGS__
延时拼接:
#define 宏连(A,B) 宏连_(A,B)
//先展开
#define 宏连_(A,B) A##B
//再拼接.
这样:
#define FOO(N) 宏连(foo_, N)
FOO(bar) // -> foo_bar
FOO(BAR()) // -> foo_bar
否则:
#define FOO(SYMBOL) foo_ ## SYMBOL
#define BAR() barFOO(bar) // -> foo_bar
FOO(BAR()) // -> foo_BAR()
//如果宏参数用于`拼接`标识符(或取字面量),则不会展开它.
1,预扫描,展开参数.
2,展开时替换,再二次扫描,继续展开宏.
#define 宏逗如(N) 宏如(N,宏逗,宏空的)()
//先返回宏函数,再延迟调用.
#define 宏逗如(N) 宏如(N,宏逗(),宏空的())
//这样会错的,会立即调用出错参数错误.
#__VA_ARGS__
可取参数字面
,且可为空.
可选:
#define log(format, ...) printf("LOG: " format __VA_OPT__(,) __VA_ARGS__)
//最后逗号是可选的.变长为空,则不要逗号
宏取几(1,(foo,bar))//->bar
//可以取元组.
要加上:
#define FOO(P, T) 宏如(P,宏取几1,宏取几0)TFOO(0, (foo, bar)) // -> foo
FOO(1, (foo, bar)) // -> bar
FOO(0, (baz)) // -> baz