如何通过MSVC宏实现L(label)自动补全参数及预期宏展开?
预期宏展开行为
#define E() E2(k) #define E2(k) printf("%d", k); #define A A2(__COUNTER__) #define A2(k) E() A
期望E()在#define A2(k) E()中先展开为E2(k),最终得到printf("%d", some_number);。
实际业务场景
用户正在完成大学作业,需要模拟仅支持以下语句的语言:
V = V + 1 V = V - 1 if (V != 0) goto LABEL
要求可创建任意数量初始值为0的变量,不能使用函数,仅通过宏复用代码。
现有ZERO宏通过__COUNTER__和__LINE__解决了标签重复定义的冲突问题:
#define L(i, k) L1(i, k, __LINE__) #define L1(i, k, l) L2(i, k, l) #define L2(i, k, l) L_##i##k##_##l #define ZERO(x) ZERO2(x, __COUNTER__) #define ZERO2(x, k) \ goto L(B, k); \ L(A, k): x = x - 1; \ L(B, k): if (x != 0) goto L(A, k);
但用户希望简化写法,无需手动编写L(label, k),仅写L(label)即可自动补全参数k,同时保证宏能正确展开、标签无冲突。
内容的提问来源于stack exchange,提问作者user22379832
相关产品推荐
相关产品推荐

