C 语言实现函数重载功能

这里以计算int型整数的和为例,设计最多输入4个整数,求和函数为:

int add(int parameter1, int parameter2, int parameter3, int parameter4)
{
        return (parameter1) + (parameter2) + (parameter3) + (parameter4);
}

        当输入参数个数小于4时,使用宏将对应数量的数字0进行填充,以使得输入参数个数保持为4个,同时不影响求和的结果。例如:将ADD(1, 2, 3)转化为 add(1, 2, 3, 0)

#include <stdio.h>
#include <stdlib.h>
/*计算参数个数*/
#define _VA_ARG_NUM(A0,A1,A2,A3,A4,N,...) N
/*##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗号*/
#define VA_ARG_NUM(...) _VA_ARG_NUM(-1,##__VA_ARGS__,4,3,2,1,0)

/*根据参数个数不同选择不同的求和方式*/
#define VA_ARG1and2(A0,A1,...) A1
#define VA_ARG3(A0,A1,A2,...) A2
#define VA_ARG4(A0,A1,A2,A3,...) A3
#define ADD(...) ((VA_ARG_NUM(__VA_ARGS__)==0)?add(0,0,0,0):\
                  (VA_ARG_NUM(__VA_ARGS__)==1)?add((VA_ARG1and2(0,##__VA_ARGS__,0)),0,0,0):\
                  (VA_ARG_NUM(__VA_ARGS__)==2)?add((VA_ARG1and2(0,##__VA_ARGS__,0)),(VA_ARG1and2(__VA_ARGS__,0,0)),0,0):\
                  (VA_ARG_NUM(__VA_ARGS__)==3)?add((VA_ARG1and2(0,##__VA_ARGS__,0)),(VA_ARG1and2(__VA_ARGS__,0,0)),(VA_ARG3(__VA_ARGS__,0,0,0)),0):\
                  (VA_ARG_NUM(__VA_ARGS__)==4)?add((VA_ARG1and2(0,##__VA_ARGS__,0)),(VA_ARG1and2(__VA_ARGS__,0,0)),(VA_ARG3(__VA_ARGS__,0,0,0)),(VA_ARG4(__VA_ARGS__,0,0,0,0))):(9))


int add(int parameter1, int parameter2, int parameter3, int parameter4)
{
        return (parameter1) + (parameter2) + (parameter3) + (parameter4);
}
int main(void) {

        int result2 = ADD(1, 2);
        int result1 = ADD(1);
        int result3 = ADD(1, 2, 3);
        int result5 = ADD();
        int result4 = ADD(1, 2, 3, 4);

        printf("%d\n%d\n%d\n%d\n%d\n",result1, result2, result3, result4, result5);
        return EXIT_SUCCESS;

}

该程序段只能在Linux环境下完成编译,输出结果为:

 参考知乎:嵌入式C语言自我修养 12:有一种宏,叫可变参数宏

           C 语言有什么奇技淫巧?

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值