展开c宏__VA_ARGS__元素

时间:2019-06-12 02:17:18

标签: c macros variadic-functions

我想定义一个这样的宏

#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__

2 个答案:

答案 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)

如果您只想向函数抛出可变数量的参数,那么__VA_ARGS__就足够了。要处理趋势逗号,有时您可能还需要##

如果要遍历参数,请使用<stdarg.h>中的varargs。

stdarg.h