【发布时间】: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