我想定义一个这样的宏
#define ASSERT_EXIST(error, ...) some-impl-here
然后我们可以这样称呼
ASSERT_EXIST(100, a, b, c)
它应该扩展到这个
if (!a_exists) return error("a is missing", 100);
if (!b_exists) return error("b is missing", 100);
if (!c_exists) return error("c is missing", 100);
其中最麻烦的部分是我无法轻松地在宏中遍历__VA_ARGS__
。
答案 0 :(得分:1)
有各种肮脏的技巧,可以使可变参数宏工作到一定的固定数量。但是,正确而正确的解决方案是根本不编写可变参宏。简单使用
是更好的做法#define ASSERT_EXISTS(val, x) if (!x##_exists) { return error(#x " is missing", val); }
ASSERT_EXIST(100, a);
ASSERT_EXIST(100, b);
...
或者更好的是,删除所有此类icky宏,以使用可读的标准C。
if(!a_exists) { return error("a is missing", 100); }
if(!b_exists) { return error("b is missing", 100); }
if(!c_exists) { return error("c is missing", 100); }
当然,代码重复是不好的做法,但是秘密宏语言却是非常不好的做法。
答案 1 :(得分:-1)