3

这是我想要做的。

step1)我想用条件语句(简单复合)调用一个宏,比如

例如:

 MACRO1(a==1)
 MACRO1((i!=NULL) && (j>10))

step2)这是我定义这个宏的方式

#define MACRO1(condition) \
        if(!(condition)) ??????????????????????????

这里在宏的定义中,如果条件语句失败。我想打印变量值,以便了解确切原因。我在定义中使用了#condition,但它只是打印条件,而不是条件中使用的变量的值。请帮忙。

4

3 回答 3

3

您可以按照以下方式做一些事情:

#define MACRO1(condition, msg) \
    if(!(condition)) { printf msg; }

并按如下方式使用它:

MACRO1(a==1, ("a: %d\n", a))
MACRO1((i != NULL) && (j>10), ("i: %p, j: %d\n", i, j));

C 预处理器只是一个简单的替换引擎,没有分析表达式内容的能力。

于 2013-10-30T06:36:04.147 回答
2

您不应该定义看起来像函数但行为不同的宏,特别是在您的情况下可能会更改控制流:else跟随包含 an 的宏if可以应用于与程序员(一周后您自己)认为的不同的东西。保护if悬空else不适用于它

#define MACRO1(COND, ...)                                             \
  do {                                                                \
    if (!(COND)) printf(stderr, "condition " #COND ": " __VA_ARGS_);  \
 } while (0)

应该始终使用格式字符串作为第二个参数和您要查看的变量的名称调用此宏

MACRO1((toto != 78.0), "toto=%9\n", toto);

这应该打印出类似的东西

condition (toto != 78.0): toto=3.14
于 2013-10-30T07:52:21.507 回答
2

我不知道如何将变量与条件分开。但是,您可以将它们作为额外参数传递:

#define MACRO(condition, printsyntax, ...) \
    if(!(condition)) {\
        printf("condition %s not met! (" printsyntax ")\n", #condition, __VA_ARGS__); \
    };

您可以将其用作:

MACRO((i!=NULL) && (j>10), "i=%p, j=%d", i, j)

一个示例结果是:

condition (i!=NULL) && (j>10) not met! (i=(nil), j=11)

编译器会将常量字符串拼接成一个用于 printf 的字符串,条件将自动打印,其余参数由您完成。

编辑

在 Jens 关于 else 的评论之后,我稍微修改了代码,以在不使用do{}while();.

于 2013-10-30T06:36:13.337 回答