如何在X宏表中跳过指定行?
如何在X宏表中跳过指定行?
哈哈,这个需求其实挺常见的!虽然X宏看起来是一股脑把所有行都展开,但确实有办法跳过指定行,我给你几个实用的思路:
临时固定跳过:直接注释行
如果只是想固定跳过某几行,最简单的方式就是在X_TABLE里把目标行注释掉,比如:#define X_TABLE(_)\ _(1, a, "hi")\ // _(2, b, "hello")\ _(3, c, "sup")这样预处理器就会忽略注释掉的行,不会生成对应的
SomeFunc调用。灵活临时跳过:用空宏“吃掉”行
要是不想用注释,还可以定义一个空的SKIP宏,把要跳过的行包起来,展开时会直接忽略这部分内容:#define SKIP(_) // 空宏,啥也不做 #define X_TABLE(_)\ _(1, a, "hi")\ SKIP(_(2, b, "hello"))\ _(3, c, "sup") #define X(_1, _2, _3) SomeFunc(_1, _2, _3); X_TABLE(X) #undef X #undef SKIP这个方法不用修改原有的
X宏定义,临时跳过的时候套个SKIP就行,非常灵活。条件化跳过:给宏加判断参数
如果需要根据条件动态决定要不要跳过行,可以给X_TABLE里的每个条目加一个控制参数,然后在X宏里做判断:#define X_TABLE(_)\ _(1, a, "hi", keep)\ _(2, b, "hello", skip)\ _(3, c, "sup", keep) #define X(_1, _2, _3, ctrl) \ #if ctrl == keep \ SomeFunc(_1, _2, _3); \ #endif X_TABLE(X) #undef X主流编译器(GCC、Clang、MSVC)都支持这种预处理器条件判断在宏里展开,适合需要根据编译选项或者宏定义来动态控制的场景。
备注:内容来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

