在#define定义中获取变量值

时间:2013-10-30 06:26:22

标签: c macros

这是我想要做的。

step1)我想调用带有条件语句的宏(简单是复合的),如

例如:

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

step2)以下是我如何定义这个宏

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

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

3 个答案:

答案 0 :(得分: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预处理器只是一个简单的替换引擎,无法分析表达式的内容。

答案 1 :(得分: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)

结果为example

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

编译器将常量字符串拼接成printf的一个字符串, 条件将自动打印,其余的参数是你的工作,以便做对。

修改

在Jens关于else的评论之后,我修改了一些代码,以便在不使用do{}while();的情况下不允许这样的结构。

答案 2 :(得分:2)

您不应该定义看起来像函数的宏,但行为不同,特别是在您的情况下可能会更改控制流:包含else的宏后面的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