【发布时间】:2021-09-09 10:03:04
【问题描述】:
我发现这两段代码与什么是可变宏有关
1.第一个例子是用来实现GNU C编译器和Visual C编译器之间的可移植性,但是我看不懂这个宏是怎么一步步展开的
MACRO_VA_ARGS(foo, bar, baz)
是先计算内括号还是外括号?
#define MACRO_WITH_3_PARAMS(p1, p2, p3) P1 = p1 | P2 = p2 | P3 = p3
#define PASS_ON(...) __VA_ARGS__
#define MACRO_VA_ARGS(...) PASS_ON(PASS_ON(MACRO_WITH_3_PARAMS)( __VA_ARGS__))
MACRO_VA_ARGS(foo, bar, baz)
第一个例子的所有代码:
#define F_OR(i, a, b, s) for (int i=(a); (s)>0?i<(b):i>(b); i+=(s))
#define F_OR1(e) F_OR(i, 0, e, 1)
#define F_OR2(i, e) F_OR(i, 0, e, 1)
#define F_OR3(i, b, e) F_OR(i, b, e, 1)
#define F_OR4(i, b, e, s) F_OR(i, b, e, s)
#define GET5(a, b, c, d, e, ...) e
#define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1)
#define FOR(...) F_ORC(__VA_ARGS__)(__VA_ARGS__)
2.我在Github上找到的第二个代码示例,我知道
#define GET5(a, b, c, d, e, ...) e
提取第 5 个元素,但我不明白这两个宏是如何扩展的:
#define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1)
#define FOR(...) F_ORC(__VA_ARGS__)(__VA_ARGS__)
第二个例子的所有代码:
#define F_OR(i, a, b, s) for (int i=(a); (s)>0?i<(b):i>(b); i+=(s))
#define F_OR1(e) F_OR(i, 0, e, 1)
#define F_OR2(i, e) F_OR(i, 0, e, 1)
#define F_OR3(i, b, e) F_OR(i, b, e, 1)
#define F_OR4(i, b, e, s) F_OR(i, b, e, s)
#define GET5(a, b, c, d, e, ...) e
#define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1)
#define FOR(...) F_ORC(__VA_ARGS__)(__VA_ARGS__)
谢谢!
【问题讨论】:
-
为什么不直接运行预处理器?使用
gcc -E -
我明白了第二个例子中发生了什么 例如: FOR(a,b,c,d) --> F_ORC(a,b,c,d)(a,b,c, d) --> GET5(a,b,c,d, F_OR4, F_OR3, F_OR2, F_OR1)(a,b,c,d) --> F_OR4(a,b,c,d) --> 等等。 FOR(a,b,c) --> F_ORC(a,b,c)(a,b,c) --> GET5(a,b,c, F_OR4, F_OR3, F_OR2, F_OR1)(a,b, c) --> F_OR3(a,b,c) --> 等等 FOR(a) --> F_ORC(a)(a) --> GET5(a, F_OR4, F_OR3, F_OR2, F_OR1)(a) --> F_OR1(a) --> 等等。谢谢!
标签: c++ c macros c-preprocessor