zoukankan      html  css  js  c++  java
  • 可变参数研究

     

    1、要使用可变参数就要包含头文件 #include <stdarg.h>。

    2、在该头文件中定义了一个va_list类型,在vadefs.h中发现:

    typedef char *  va_list;

    3、在该头文件中还定义了用来遍历参数列表的4个宏:

    #define va_start _crt_va_start

    #define va_arg _crt_va_arg

    #define va_end _crt_va_end

    #define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )

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

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

    4、在MSDN中的定义为:

    The va_arg, va_end, and va_start macros provide a portable way to access the arguments to a function when the function takes a variable number of arguments. Two versions of the macros are available: The macros defined in STDARG.H conform to the ANSI C standard, and the macros defined in VARARGS.H are compatible with the UNIX System V definition. The macros are:

    va_alist

    Name of parameter to called function (UNIX version only)

    va_arg

    Macro to retrieve current argument

    va_dcl

    Declaration of va_alist (UNIX version only)

    va_end

    Macro to reset arg_ptr

    va_list

    typedef for pointer to list of arguments defined in STDIO.H

    va_start

    Macro to set arg_ptr to beginning of list of optional arguments (UNIX version only)

    Both versions of the macros assume that the function takes a fixed number of required arguments, followed by a variable number of optional arguments. The required arguments are declared as ordinary parameters to the function and can be accessed through the parameter names. The optional arguments are accessed through the macros in STDARG.H or VARARGS.H, which set a pointer to the first optional argument in the argument list, retrieve arguments from the list, and reset the pointer when argument processing is completed.

    The ANSI C standard macros, defined in STDARG.H, are used as follows:

    ·         All required arguments to the function are declared as parameters in the usual way. va_dcl is not used with the STDARG.H macros.

    ·         va_start sets arg_ptr to the first optional argument in the list of arguments passed to the function. The argument arg_ptr must have va_list type. The argument prev_param is the name of the required parameter immediately preceding the first optional argument in the argument list. If prev_param is declared with the register storage class, the macro's behavior is undefined. va_start must be used before va_arg is used for the first time.

    ·         va_arg retrieves a value of type from the location given by arg_ptr and increments arg_ptr to point to the next argument in the list, using the size of type to determine where the next argument starts. va_arg can be used any number of times within the function to retrieve arguments from the list.

    ·         After all arguments have been retrieved, va_end resets the pointer to NULL.

    The UNIX System V macros, defined in VARARGS.H, operate somewhat differently:

    ·         Any required arguments to the function can be declared as parameters in the usual way.

    ·         The last (or only) parameter to the function represents the list of optional arguments. This parameter must be named va_alist (not to be confused with va_list, which is defined as the type of va_alist).

    ·         va_dcl appears after the function definition and before the opening left brace of the function. This macro is defined as a complete declaration of the va_alist parameter, including the terminating semicolon; therefore, no semicolon should follow va_dcl.

    ·         Within the function, va_start sets arg_ptr to the beginning of the list of optional arguments passed to the function. va_start must be used before va_arg is used for the first time. The argument arg_ptr must have va_list type.

    ·         va_arg retrieves a value of type from the location given by arg_ptr and increments arg_ptr to point to the next argument in the list, using the size of type to determine where the next argument starts. va_arg can be used any number of times within the function to retrieve the arguments from the list.

    ·         After all arguments have been retrieved, va_end resets the pointer to NULL.

    5、Example:


  • 相关阅读:
    CSS3中的opacity透明度属性的继承问题如何解决
    webstorm前端开发工具vue环境配置及运行项目
    new String(getBytes(ISO-8859-1),UTF-8)中文编码避免乱码
    超详细多线程讲解
    jQuery mobile 核心功能
    解读四大移动web应用开发框架真相
    2014,成为更好程序员的7个方法
    window8.1使用之快捷键
    C#深入浅出 关键字(一)
    C#深入浅出 C#语法中的重中之重——委托(四)
  • 原文地址:https://www.cnblogs.com/johnpher/p/2570622.html
Copyright © 2011-2022 走看看