1

为了更清晰的错误处理,我使用宏(它使用 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针对这种行为修改我的宏?即我需要一种方法来检查msg参数是否没有传递给宏。

4

1 回答 1

3

在建议问题的帮助下,我发现您可以像这样修改宏。

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

因此,如果您不通过,您的新A_NEW宏调用将扩展为.A(cond, 0)msg

这个博客很好地解释了可变参数宏。

于 2013-12-22T12:16:38.010 回答