用于打印可变参数的宏,可选择无参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于打印可变参数的宏,可选择无参数相关的知识,希望对你有一定的参考价值。

我想实现以下宏:

ASSERT(condition, ...)          

其定义如下: 1.如果它只有一个参数 - 如果条件为假,我们只打印“条件为假”。 2.如果它获得两个或更多参数 - 与上面相同,另外:第二个参数将是打印格式(类似于printf格式),其余参数将用于打印格式(再次,就像printf一样) 。因此,除了“条件为假”的可能打印之外,它还将打印像printf那样的格式。

例子:

  1. ASSERT(0): condition is false
  2. ASSERT(1): (empty output)
  3. ASSERT(0,“hi”): condition is false hi
  4. ASSERT(0,“数字7:%d”,7): condition is false number seven: 7

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

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

您可以从此宏中删除format参数(将它们拉入可变参数部分)。 "condition is false "和格式字符串(如果存在)将连接成一个没有##的字符串。

#include <stdio.h>

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

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

局限性:

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

以上是关于用于打印可变参数的宏,可选择无参数的主要内容,如果未能解决你的问题,请参考以下文章

用于定义具有可变参数的函数的嵌套#define 问题

define可变参数,float数据传输

C语言宏定义实现可变参数

高分求助VC中关于不定参数宏的使用

#define 用于在 C 中调试打印的宏?

C++ 预处理器 __VA_ARGS__ 参数数量