美文网首页
用宏解决C语言变参函数无法获取参数数量的问题

用宏解决C语言变参函数无法获取参数数量的问题

作者: herolin0306 | 来源:发表于2017-09-25 22:32 被阅读0次

最近在做一个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月份注册的简书,今天才写第一篇文章啊,转载请注明出处哦^_^

相关文章

  • 用宏解决C语言变参函数无法获取参数数量的问题

    最近在做一个LED blink函数库的时候,打算用变参函数来作为api,但是众所周知,变参函数需要传入参数的数量,...

  • 函数变参的使用

    介绍C/C++,java,和go语言对函数变参的使用。 1. C/C++语言的变参 1.1 变参函数声明 变参函数...

  • 代码分析之va_list及UIAlertController的封

    va_list是在C语言中解决变参问题的一组宏,长用来出来不定参数 在iOS中也可使用,使用场景一般是参数为如下 ...

  • fluent python 1

    1 用*来获取不确定数量的参数 用*来获取不确定数量的参数 2 用*运算符来把一个可迭代对象的参数拆开作为函数的参...

  • va_list 可变参数概览

    前言 VA_LIST 解决变参问题的一组宏,所在头文件:#include ,用于获取不确定个数的参数 比如我们最...

  • iOS开发中va_list的应用

    va_list的定义: VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include ,用于获...

  • C语言可变数量参数的使用

    C语言支持函数带有可变数量的参数。 可变参数数量的函数格式如下: 函数 func() 最后一个参数写成省略号,即三...

  • 内联函数

    内联函数是为了解决c语言中宏出现的问题所设计的用inline关键字标记的函数: 对于内联函数,VC编译链接是把它的...

  • C语言----可变参数

    有时,可能会碰到这样的情况,希望函数带有可变数量的参数,而不是预定义数量的参数。C 语言为这种情况提供了一个解决方...

  • 精解C语言预处理命令(三)之“宏”的用法二

    关于C语言带参数的宏定义中的参数 C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实...

网友评论

      本文标题:用宏解决C语言变参函数无法获取参数数量的问题

      本文链接:https://www.haomeiwen.com/subject/nmcjextx.html