#include<stdio.h>
#include<stdlib.h>
/* 第一种方法*/
#define get5th(a1,a2,a3,a4,a5,a6,...) a6 //需要比要调用函数多一位
//将arr倒转
#define tarr(a1,a2,a3,a4,a5,...) get5th(__VA_ARGS__,a5,a4,a3,a2,a1)
#define arr(...) tarr(sum4(__VA_ARGS__,0,0,0,0),sum4(__VA_ARGS__,0,0,0),sum4(__VA_ARGS__,0,0),\
sum4(__VA_ARGS__,0),sum4(__VA_ARGS__),##__VA_ARGS__)
/* 第二种方法*/
#define DE_ARG(tmp,de) ((*#tmp)?(tmp+0):de)
#define sum_DE(a1,a2,a3,a4,a5) sum4(DE_ARG(a1,0),DE_ARG(a2,0),DE_ARG(a3,0),DE_ARG(a4,0),DE_ARG(a5,0))
int sum4(int a,int b,int c,int d,int e)
{
return a+b+c+d+e;
}
void main()
{
printf("%d \n",arr(2,2,3,4,5));
printf("%d\n",sum_DE(1,,,,));
printf("%d %p",*"",*(""+1));
return ;
}
第一种使用了可变参宏, 这个版本没有使用延迟展开, 兼容性比较好,但是无法处理无参数情况.
第二种使用宏定义中的#
将变量转化为字符串, 以实现由空
转0
的效果.存在问题消耗运行算力.