zoukankan      html  css  js  c++  java
  • C++传递不定参函数

    定义不定参数函数,要用到下面这些宏:

    • va_start(ap, farg): 初始化一个va_list变量ap,farg是第一个形参
    • va_arg(ap, type): 获取(下)一个type类型的参数
    • va_end(ap): 结束使用ap

    C语言里编写不定参数函数的形式是这样的:

    #include <stdarg.h>
    int sum(int cnt,...) {
        int sum = 0;
        int i;
        va_list ap;
        va_start(ap, cnt);
        for(i = 0; i < cnt; ++i)
            sum += va_arg(ap, int);
        va_end(ap);
        return sum;
    }

    定义不定参数函数,要用到下面这些宏:

    • va_start(ap, farg): 初始化一个va_list变量ap,farg是第一个形参
    • va_arg(ap, type): 获取(下)一个type类型的参数
    • va_copy(ap): 用于复制参数列表
    • va_end(ap): 结束使用ap
      这些宏定义一般在stdarg.h里。
    typedef char * va_list;
    #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1)  )
    #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v)  )
    #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t))  )
    #define va_end(ap) ( ap = (va_list)0 )

    注意: 上面这些宏定义会因不同的系统和不同的处理器架构而不同

    _INTSIZEOF宏
    _INTSIZEOF这个宏的位运算意义比较难理解,乍一看以为是表示多少个int型的长度,其实它运算出来的结果是按照int型对齐后的长度。比如int型为4个字节,_INTSIZEOF(1)、_INTSIZEOF(2)、_INTSIZEOF(3)、_INTSIZEOF(4)的结果都是4,_INTSIZEOF(5)、_INTSIZEOF(6)、_INTSIZEOF(7)、_INTSIZEOF(8)的结果都是8,这正是x86架构CPU下的参数传递方式,32位即4字节对齐。

    几个注意事项

    • 不定参数的函数至少要有一个固定的参数,因为要用它来初始化va_list,比如上面代码中sum函数的cnt参数,同时它也表明了传递的参数的个数。

    常用方式

    不定参数函数最常用来格式化字符串,一个比较常见的场景是我们想输出一些log消息,但又不能直接在控制台输出,需要自己写一个log函数来格式化log消息并输出。这时我们可以用vsprintf函数:

    void log(const char *format, ...) {
        char buf[MAX_BUF_SIZE];
        va_list ap;
        va_start(ap, format);
        vsprintf(buf, format, ap);
        OUTPUT(buf);
    }

    vsprintf函数的前两个参数和sprintf的前两个参数意义相同,只不过后面的不定参换成了va_list类型的参数列表,这正是让我们用来定义自己的格式化函数的。

    https://www.cnblogs.com/luzhlon/p/7087080.html

  • 相关阅读:
    转 Java高级程序员面试题
    发个说说0.0
    SpringMvc和servlet对比
    java面试数据类型
    java面试 关键字
    Ajax与传统Web开发的区别
    ssm框架常见问题
    浅谈C++多态性
    [转载]构造函数、析构函数可否声明为虚函数
    为什么不要在构造函数和析构函数中调用虚函数?
  • 原文地址:https://www.cnblogs.com/feng9exe/p/11016394.html
Copyright © 2011-2022 走看看