重点:
1.注意__VA_ARGS__
和宏定义的...(参数列表)配套使用
__VA_ARGS__
是C/C++中的一个宏,用于在宏定义中表示可变数量的参数(variadic arguments)。它通常与宏函数(函数式宏)一起使用,以便可以在宏中处理不定数量的参数。
在宏定义中,__VA_ARGS__
表示所有传递给宏的参数,可以是零个或多个参数。下面是一个使用 __VA_ARGS__
的简单示例:
#include <iostream>
#define LOG(...) std::cout << __VA_ARGS__ << std::endl
int main() {
LOG("Hello, World!"); // 输出:Hello, World!
LOG("The answer is", 42); // 输出:The answer is 42
return 0;
}
在上面的示例中,LOG
是一个宏,它使用 __VA_ARGS__
来接受可变数量的参数,并将它们打印到标准输出流。
注意以下几点:
__VA_ARGS__
必须位于宏定义的参数列表中的最后。- 在
__VA_ARGS__
前后可以有其他参数,但至少要有一个参数,以便在没有传递额外参数时编译不会出错。 - 使用逗号
,
分隔参数。在示例中,LOG("The answer is", 42)
中的逗号会被认为是两个不同的参数。
__VA_ARGS__
是一个强大的特性,它允许你创建具有可变数量参数的宏,以实现各种不同的功能,如条件性地打印日志、生成代码等。但要小心使用,确保不会导致宏展开时的意外行为。
2.计算__VA_ARGS__个数的方法
ARG_N_HELPER计算可输入参数个数最高为20个
#define ARG_T(t) t //解决VC编译错误
#define ARG_N(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,N,...) N //截取并返回第四个参数,这里限制了可变参数计算的范围[1,4]
#define ARG_N_HELPER(...) ARG_T(ARG_N(__VA_ARGS__)) //辅助宏
#define COUNT_ARG(...) ARG_N_HELPER(__VA_ARGS__,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) //返回可变参数个数
int main() {
int numArgs = COUNT_ARG(1, 2, 3, 4, 5,1,1,1,1,1,1,1,1,1,1,1,1,1);
std::cout << "Number of arguments: " << numArgs << std::endl;
return 0;
}