zoukankan      html  css  js  c++  java
  • va_list va_start va_arg va_end解析

    最近在学野火的M3板子,发现串口的发送程序发现有va_list va_list va_start va_arg这些东东,以前没见到过啊。于是乎上网百度了一番,可得到出一下结论:

    va_list va_start va_arg va_end这些是用在C函数的参数不确定时会用到的如printf()函数。
    在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:
    #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 )                            // 将指针置为无效
    实际上va_list va_start va_arg va_end的作用就是将可变参数(即参数个数可变)一个一个的取出来。
    例:int fun1(int i,...) //此例子中在i变量后面出现的参数都是可变参数
    {
    va_list arg_ptr;
    va_start( arg_ptr ,i);//得到第一个可变参数的地址,即i后一个参数的地址
    va_arg( arg_ptr ,数据类型); //得到第一个参数的值,并将值转化为你想要的数据类型
    //然后arg_ptr指向下一个可变参数的地址
    va_end(arg_ptr); //置空
    }


    int fun2(int i,int y...) //此例子中在i变量后面出现的参数都是可变参数
    {
    va_list arg_ptr;
    va_start( arg_ptr ,y); //得到第一个可变参数的地址,即y后一个参数的地址
    va_arg( arg_ptr ,数据类型); //得到第一个参数的值,并将值转化为你想要的数据类型
    //然后arg_ptr指向下一个可变参数的地址
    va_end(arg_ptr); //置空
    }
    用这两个函数只是想说明那些是可变参数,可变参数时函数中用"..."表示的参数(具体看va_start()函数的参数),
    如果没看明白我上面的解释,下面给出两个博客的地址你懂的
    1   2
  • 相关阅读:
    使用WebViewJavascriptBridge与UIWebView交互
    使用UICollectionView
    UIButton中的**EdgeInsets是做什么用的?
    [翻译] CoreImage-with-EAGLContext
    [翻译] SAMCoreImageView
    [翻译] NSImage+HHTint
    使用iCarousel的旋转木马效果请求图片
    使用TFHpple解析html
    使用MapKit框架(持续更新)
    定制UITabBar显示样式
  • 原文地址:https://www.cnblogs.com/vendanner/p/4784388.html
Copyright © 2011-2022 走看看