C 用于打印可变参数的宏,带有无参数选项

C 用于打印可变参数的宏,带有无参数选项,c,macros,c-preprocessor,variadic,variadic-macros,C,Macros,C Preprocessor,Variadic,Variadic Macros,我要实现以下宏: ASSERT(condition, ...) condition is false hi condition is false number seven: 7 定义如下: 1.如果它只得到一个参数-如果条件为假,我们只打印“条件为假”。 2.如果它得到两个或更多参数-同上,另外:第二个参数将是printing format(类似于printf format),其余参数将是printing format(同样,与printf相同)。因此,除了可能打印“c

我要实现以下宏:

ASSERT(condition, ...)          
condition is false
hi
condition is false
number seven: 7
定义如下:
1.如果它只得到一个参数-如果条件为假,我们只打印“条件为假”。
2.如果它得到两个或更多参数-同上,另外:第二个参数将是printing format(类似于printf format),其余参数将是printing format(同样,与printf相同)。因此,除了可能打印“condition is false”之外,它还将像printf一样打印格式

ASSERT(condition, ...)          
condition is false
hi
condition is false
number seven: 7
示例:

ASSERT(condition, ...)          
condition is false
hi
condition is false
number seven: 7
  • 断言(0):

    ASSERT(condition, ...)          
    
    condition is false
    hi
    
    condition is false
    number seven: 7
    
  • 断言(1):

    ASSERT(condition, ...)          
    
    (empty output)
    
    condition is false
    hi
    
    condition is false
    number seven: 7
    
  • 断言(0,“hi”):

    ASSERT(condition, ...)          
    
    condition is false
    hi
    
    condition is false
    number seven: 7
    
  • 断言(0,“第七个:%d”,第7个):

    ASSERT(condition, ...)          
    
    condition is false
    hi
    
    condition is false
    number seven: 7
    
  • 我的问题是,我不知道如何支持零变量参数的情况。如果我知道至少可以得到两个参数,我可以像下面的代码那样实现它,但事实并非如此。
    我如何修改下面的代码来支持我所需要的

    ASSERT(condition, ...)          
    
    condition is false
    hi
    
    condition is false
    number seven: 7
    
    #define ASSERT(condition, format,...) do { \
      if (!(condition)) { \
        printf(format, ##__VA_ARGS__); \
      } \
    } while (0)
    

    您可以从此宏中删除
    format
    参数(将它们拉入变量部分)<代码>“条件为假\n”和格式字符串(如果存在)将连接成一个字符串,而不使用

    ASSERT(condition, ...)          
    
    condition is false
    hi
    
    condition is false
    number seven: 7
    
    #包括
    #定义断言(条件,…)do{\
    如果(!(条件)){\
    printf(“条件为假\n”\uuuu VA\u ARGS\uuuuu)\
    } \
    }而(0)
    int main()
    {
    断言(1);
    断言(0);
    断言(0,“Hi\n”);
    断言(0,“数字为%d\n”,7);
    返回0;
    }
    
    限制:

    ASSERT(condition, ...)          
    
    condition is false
    hi
    
    condition is false
    number seven: 7
    
    • 格式
      应仅为字符串文字,而不是指向字符数组的指针
    可能的副本