zoukankan      html  css  js  c++  java
  • va_list va_start va_end va_arg 解决变参问题

    解决参数个数不确定的问题。

    头文件 #include<stdarg.h>

    VA_LIST 是在C语言中解决变参问题的一组宏,用于获取不确定个数的参数。

    #ifdef _M_ALPHA
    typedef struct {
    char *a0; /* pointer to first homed integer argument */
    int offset; /* byte offset of next parameter */
    } va_list;
    #else
    typedef char * va_list;
    #endif
    _M_ALPHA是指DEC ALPHA(Alpha AXP)架构。所以一般情况下va_list所定义变量为字符指针。
    INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:
    #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

    VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):

    #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

    VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):

    #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

    VA_END宏,清空va_list可变参数列表:

    #define va_end(ap) ( ap = (va_list)0 )

    程序例子:

    //.h
    
        FILE* stream;   
    //...
        void print(YX_DebugLevel level, const char* format ...);
        void print(const char* format ...);
    //.cpp
    
    //...
    
    /**
     * Prints the given message to stdout.
     */
    void YX_Debug::print(const char* format ...)  //函数1
    {
        if(debugLevel==D_DEBUGGING)
        {
            va_list ap;
            va_start(ap, format);
            vfprintf(stream, format, ap);
            fprintf(stream, "
    ");
            va_end(ap);
            fflush(stream);
        }
    }
    
    void YX_Debug::print(YX_DebugLevel level, const char* format ...) //函数2
    {
        if(debugLevel>=level)
        {
            va_list ap;
            va_start(ap, format);
            vfprintf(stream, format, ap);
            fprintf(stream, "
    ");
            va_end(ap);
            fflush(stream);
        }
    }
    
    //...
    
        print( D_NOTHING, "YX_DEBUG::setLevel(%d)", level); //调用函数2
        print( D_CRITICAL, "YX_DEBUG: Critical"); //调用函数2
        print("[%X] %c", text.at(i).unicode(), text.at(i).toLatin1());//调用函数1
  • 相关阅读:
    【hdu 4135】Co-prime
    【cdoj 1544】当咸鱼也要按照基本法
    【SRM 717 DIV2 C】DerangementsDiv2
    【codeforces 821E】Okabe and El Psy Kongroo
    【SRM 717 div2 B】LexmaxReplace
    【SRM 717 div2 A】 NiceTable
    Network architecture for minimalistic connected objects
    C# 委托的理解
    50条超精辟的经典语录:哗众,可以取宠,也可以失宠!
    50条超精辟的经典语录:哗众,可以取宠,也可以失宠!
  • 原文地址:https://www.cnblogs.com/azbane/p/8675742.html
Copyright © 2011-2022 走看看