【问题标题】:Checking if an argument is passed in variadic macros in C检查参数是否在 C 中的可变参数宏中传递
【发布时间】:2013-12-22 09:35:18
【问题描述】:

为了更清晰的错误处理,我使用了一个宏(它使用 C99 和 GCC 扩展);行为就像标准assert

#define A(cond, msg, ...) ({ \
        if (!(cond)) { \
                if (msg) \
                        say(msg, ##__VA_ARGS__); \
                else \
                        say("Error at file %s, function %s, line %u: %s", \
                                __FILE__, __func__, __LINE__, #cond); \
                A_RETURN(); \
        } \
})

其中say 是格式化输出。并像这样使用它:

#undef A_RETURN
#define A_RETURN() ({ fclose(f); free(p); return false; })

A(foo() != FOO_ERROR, 0);
A(bar() != BAR_ERROR, "bar failed");

当我没有具体的错误信息时,我必须写A(cond, 0)。但在这种情况下,我只想写A(cond)。如何针对这种行为修改我的 A 宏? IE。我需要一种方法来检查 msg 参数是否未传递给宏。

【问题讨论】:

  • #define A_no_msg(cond) A(cond, NULL)
  • 您可以尝试使用一些参数计数来实现这一点,详见此处stackoverflow.com/a/14674318/817643 该示例使用了全部可用的 64 个参数。你只需要一个。我全心全意地建议您使用另一个宏名称。
  • @selbie:我想要一个宏。

标签: c gcc c99 variadic-macros


【解决方案1】:

suggested question 的帮助下,你可以像这样修改你的宏。

#define A() .... //your macro

#define A_CALC_ARG_IMPL(_1,N,...) N
#define A_CALC_ARG(...) A_CALC_ARG_IMPL(__VA_ARGS__,0)

#define A_NEW(...) A(cond, A_CALC_ARG(__VA_RGS__))

所以如果你没有通过msg,你的新A_NEW宏调用将扩展为A(cond, 0)

变量宏很好解释at this blog

【讨论】:

  • 您好,很遗憾,为 Variadic 宏解释 提供的链接现在无效。你能更新你的问题吗?谢谢和问候
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2023-03-18
  • 2010-12-24
相关资源
最近更新 更多