有毛病的C++宏编程

本文介绍了C++中的宏重载技术,这是一种利用#define和可变参数实现宏定义根据参数数量调用不同函数的编程技巧。通过一个具体的demo实例展示了如何使用宏重载,例如FIGHT(2,2)最终会调用FIGHT2(2,2)方法,从而简化复杂宏的调试和使用。

无用的抱怨

找不到一个比较好的方法调试宏,宏每一步的替换结果无法仅仅从代码上看出来了,特别是多层嵌套。

真的是油饼!不晓得为啥整个这个宏编程!

老子终于找到是什么方向了,叫宏重载,真的是干他妈!找了老子一下午!

宏重载介绍

正经点说:宏重载准确说是一种C++编程技巧,巧妙利用#define和可变参数结合,让宏定义根据参数的数量,调用不同的函数,具体原理是根据参数个数调用MOCK_FUNCTION##N(可以自定义这个名字、N是指具体参数个数)。
注意:这里的重载不是传统意义上的重载,这里重载的方法名不一样。

demo实例

下面给出一个例子:
效果是FIGHT(2,2); 最后会调用FIGHT2(2,2)方法。

#include "iostream"

#define __NARG__(...) __NARG_I_(__VA_ARGS__, __RSEQ_N())
#define __NARG_I_(...) __ARG_N(__VA_ARGS__)
#define __ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, \
                _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, \
                _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, \
                _63, N, ...)  N
#define __RSEQ_N()                                                                                                    \
  63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, \
      34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, \
      5, 4, 3, 2, 1, 0

// general definition for any function name
#define _VFUNC_(name, n) name##n
#define _VFUNC(name, n) _VFUNC_(name, n)
// 前半部分生成方法的名字,此处是MOCK_FUNCTION2,后半部分是生成参数,此处结果是(2,2)
// 合起来之后是 MOCK_FUNCTION2(2,2)
#define VFUNC(func, ...) _VFUNC(func, __NARG__(__VA_ARGS__))(__VA_ARGS__) 

// definition for FIGHT,效果 FIGHT(可变参数) -> 调用FIGHTN(N个参数)
#define FIGHT(...) VFUNC(MOCK_FUNCTION, __VA_ARGS__)
#define FIGHT1(arg) WithOne(arg)
#define FIGHT2(arg_one, arg_two) WithTwo(arg_one, arg_two)

int MOCK_FUNCTION1(int a) {
    printf("a");
    return 0;
}

int MOCK_FUNCTION2(int a, int b) {
    printf("ab");
    return 0;
}

int main(){
    FIGHT(2,2);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值