这里以计算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环境下完成编译,输出结果为: