用于打印可变参数的宏,可以选择不带参数
Macro for printing variadic arguments, with the option of no arguments
我想实现下面的宏:
ASSERT(condition, ...)
定义如下:
1. 如果它只有一个参数——如果条件为假,我们就打印 "condition is false".
2. 如果它有两个或更多参数 - 与上面相同,另外:第二个参数将是打印格式(类似于 printf 格式),其余参数将用于打印格式(再次,就像 printf 一样) .因此,除了 "condition is false" 的可能打印之外,它还会像 printf 一样打印格式。
示例:
断言(0):
condition is false
断言(1):
(empty output)
断言(0,"hi"):
condition is false
hi
断言(0,"number seven: %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\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
应该是 只有 字符串文字,而不是指向字符数组的指针
我想实现下面的宏:
ASSERT(condition, ...)
定义如下:
1. 如果它只有一个参数——如果条件为假,我们就打印 "condition is false".
2. 如果它有两个或更多参数 - 与上面相同,另外:第二个参数将是打印格式(类似于 printf 格式),其余参数将用于打印格式(再次,就像 printf 一样) .因此,除了 "condition is false" 的可能打印之外,它还会像 printf 一样打印格式。
示例:
断言(0):
condition is false
断言(1):
(empty output)
断言(0,"hi"):
condition is false hi
断言(0,"number seven: %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\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
应该是 只有 字符串文字,而不是指向字符数组的指针