用于打印可变参数的宏,可以选择不带参数

时间:2018-10-29 10:06:58

标签: c macros c-preprocessor variadic variadic-macros

我要实现以下宏:

condition is false 

定义如下:
1.如果它仅获得一个参数-如果条件为假,则仅打印“条件为假”。
2.如果它获得两个或多个参数-与上述相同,并且另外:第二个参数将是打印格式(类似于printf格式),其余参数将用于打印格式(同样,与printf一样) 。因此,除了可能打印“条件为假”之外,它还将打印类似printf的格式。

示例:

  1. ASSERT(0):

    (empty output)
    
  2. ASSERT(1):

    condition is false
    hi
    
  3. ASSERT(0,“ hi”):

    condition is false
    number seven: 7
    
  4. ASSERT(0,“数字7:%d”,7):

    #define ASSERT(condition, format,...) do { \
      if (!(condition)) { \
        printf(format, ##__VA_ARGS__); \
      } \
    } while (0)
    

我的问题是我不知道如何支持零可变参数的情况。如果我确定至少可以确定两个参数,则可以像下面的代码中那样实现它,但事实并非如此。
如何修改下面的代码以支持所需的内容?

{{1}}

1 个答案:

答案 0 :(得分:2)

您可以从此宏中删除format自变量(将其放入可变参数部分)。 "condition is false\n"和格式字符串(如果有的话)将被串联成一个不包含##的字符串。

#include <stdio.h>

#define ASSERT(condition, ...) do { \
  if (!(condition)) { \
    printf("condition is false\n" __VA_ARGS__); \
  } \
} while (0)

int main()
{
    ASSERT(1);
    ASSERT(0);
    ASSERT(0,"Hi\n");
    ASSERT(0,"number is %d\n",7);
    return 0;
}

限制:

  • format应该是 字符串文字,而不是指向字符数组的指针