可变参数宏的展开,宏重载

重载(overloading),简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

C++里最常用和熟悉的有函数重载,运算符重载,模板重载。在开发过程中有时为了方便,用到宏,网上查了下,也能将宏重载。

http://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments?rq=1

VS和GCC展开__VA_ARGS__的方式有些不同,以下在VS2015下测试可行

1.定义

1 #define PRIVATE_ARGS_GLUE(x, y) x y
 2 #define PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT(_1,_2,_3,_4,_5,_6,_7,_8,_9, N, ...) N
 3 #define PRIVATE_MACRO_VAR_ARGS_IMPL(args)  PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT args
 4 #define COUNT_MACRO_VAR_ARGS(...)  PRIVATE_MACRO_VAR_ARGS_IMPL((__VA_ARGS__,10,9,8,7,6,5 4,3,2,1,0))
 5 
 6 #define PRIVATE_MACRO_CHOOSE_HELPER2(M,count)  M##count
 7 #define PRIVATE_MACRO_CHOOSE_HELPER1(M,count)  PRIVATE_MACRO_CHOOSE_HELPER2(M,count)
 8 #define PRIVATE_MACRO_CHOOSE_HELPER(M,count)   PRIVATE_MACRO_CHOOSE_HELPER1(M,count)
 9 
10 #define INVOKE_VAR_MACRO(M,...) PRIVATE_ARGS_GLUE(PRIVATE_MACRO_CHOOSE_HELPER(M,COUNT_MACRO_VAR_ARGS(__VA_ARGS__)), (__VA_ARGS__))

COUNT_MACRO_VAR_ARGS用来统计参数个数,用的很巧妙。下面是使用方法

2.实现

1 #define PRINT_ARGS1(a1) std::cout<<a1<<std::endl
2 #define PRINT_ARGS2(a1,a2) std::cout<<a1<<","<<a2<<std::endl
3 #define PRINT_ARGS3(a1,a2,a3) std::cout<<a1<<","<<a2<<","<<a3<<std::endl
4 #define PRINT_ARGS4(a1,a2,a3,a4) std::cout<<a1<<","<<a2<<","<<a3<<","<<a4<<std::endl

3.使用

1 INVOKE_VAR_MACRO(PRINT_ARGS, 4);
2 INVOKE_VAR_MACRO(PRINT_ARGS, 4, 5);
3 INVOKE_VAR_MACRO(PRINT_ARGS, 4, 5, 6);

4.输出

4

4,5

4,5,6

5.优缺点

优点:读写方便,使用宏时不需要后面带数字

缺点:不支持0个参数
原文链接: https://www.cnblogs.com/goooon/p/5642514.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/236457

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午5:02
下一篇 2023年2月13日 下午5:02

相关推荐