C++利用不定参数宏计算不定参数的个数

C++宏函数是支持不定参数的,那么如何确定不定参数的个数呢?

废话少说,直接上代码吧。

#define DBG_16TH(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, \
                      _14, _15, _16, ...)                                     \
  _16
#define DBG_NARG(...) \
  DBG_16TH(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

上面这一段代码就可以利用不定参数宏函数计算输入参数的个数。

#include <iostream>
using namespace std;

#define DBG_16TH(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, \
                      _14, _15, _16, ...)                                     \
  _16
#define DBG_NARG(...) \
  DBG_16TH(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main() {
    cout << DBG_NARG(arg1, arg2, arg3) << endl;
    cout << DBG_NARG(arg1, arg2, arg3,arg4) << endl;
    return 0;
}

上面这段程序的输出结果为:

3
4

说明不定参数宏函数DBG_NARG(...)可以根据传入的参数来自动计算参数的个数。

原理分析:

当给不定宏函数DBG_NARG(...)传入参数的时候,会将参数传递给DBG_16TH():

// DBG_NARG传入1个参数
DBG_16TH(arg1, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, \
    1, 0)   // 第16个参数为1

// DBG_NARG传入2个参数
DBG_16TH(arg1, arg2,15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, \
    2, 1, 0) // 第16个参数为2

// DBG_NARG传入3个参数
DBG_16TH(arg1, arg2, agr3, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, \
    4, 3, 2, 1, 0)  // 第16个参数为3
而DBG_16TH也是一个不定参数宏函数,并且将参数截断为第16个参数,当参数通过DBG_NARG传递
给DBG_16TH是,将15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0往后推:
传入1个参数时:DBG_16TH第16个参数为1,即获得参数个数为1
传入2个参数时:DBG_16TH第16个参数为2,即获得参数个数为2
传入3个参数时:DBG_16TH第16个参数为3,即获得参数个数为3
...

猜你喜欢

转载自blog.csdn.net/weixin_43354152/article/details/129773232