最近在做一个LED blink函数库的时候,打算用变参函数来作为api,但是众所周知,变参函数需要传入参数的数量,而参数的数量只能靠编程者自己计算,稍有不慎就会出错,于是自己写了一个宏,可以实现类似变参函数的效果而无需传入参数数量,下面用最常见的求和函数进行示例:
#include <stdio.h>
#define CALC_SUM(ret_p, ...) \
do { \
int arg[] = {__VA_ARGS__}; \
if (ret_p) *(int *)(ret_p) = calc_sum(arg, sizeof(arg)/sizeof(int)); \
else calc_sum(arg, sizeof(arg)/sizeof(int)); \
}while(0)
int calc_sum(int *buf, int count)
{
int sum = 0;
int i;
for (i=0;i<count;i++) {
sum += *(buf + i);
}
return sum;
}
int main(int argc, char *argv[])
{
int sum = 0;
CALC_SUM(&sum, 1, 2, 3); //直接填入参数,无需填入数量
printf("sum = %d\r\n", sum);
CALC_SUM(&sum, 4, 5, 6, 7, 8); //直接填入参数,无需填入数量
printf("sum = %d\r\n", sum);
return 0;
}
运行结果:
sum = 6
sum = 30
其实本质上就是用int arg[] = {VA_ARGS}对宏的变参部分构造了一个局部变量数组,便于求出参数的数量。
5月份注册的简书,今天才写第一篇文章啊,转载请注明出处哦^_^
网友评论