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

标签 c macros c-preprocessor variadic variadic-macros

我想实现以下宏:

ASSERT(condition, ...)          

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

示例:

  1. 断言(0):

    condition is false 
    
  2. 断言(1):

    (empty output)
    
  3. ASSERT(0, "嗨") :

    condition is false
    hi
    
  4. ASSERT(0, "数字七: %d", 7) :

    condition is false
    number seven: 7
    

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

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

最佳答案

您可以从此宏中删除 format 参数(将它们拉入可变参数部分)。 “条件为 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 应该字符串文字,而不是指向字符数组的指针

关于c - 用于打印可变参数的宏,可以选择无参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53043110/

相关文章:

c++ - 什么是 G_STMT_START 和 G_STMT_END?

C 元宏模式匹配

c++ - 如何在 MSVC 下检测 C++11 的 noexcept 特性?

gcc - 如何在 gcc 程序集中启用预处理器

c - 从函数返回静态字符数组 提供不正确的答案

c - 如何在C中使用√符号

c 程序时间转换 24 小时到 12 小时

c - Raspberry pi 上的 I2C_SLAVE 和 I2C_RDWR 返回值错误

macros - 跨 CMakeLists 的 CMake 宏

C 预处理器宏