stdarg.h

standrad parameter

该头文件包含了一个变量类型和3个宏

变量类型

va_list

#ifndef _VA_LIST_DEFINED
#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

它通常是一个字符型指针

va_start ( va_list valist , int num )

用于初始化va_list型的变量,从左到右获取num个参数。

va_arg ( valist valist , type )

以type型返回当前valist指向的参数,然后让valist所指的地址向后移动sizeof(type)个字节

就相当于返回type型的一个参数,然后valist指向下一个参数

va_end ( va_list valist )

让va_list型的变量指向NULL

就相当于释放了va_list

头文件

  1 /***
  2 *stdarg.h - defines ANSI-style macros for variable argument functions
  3 *
  4 *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
  5 *
  6 *Purpose:
  7 *       This file defines ANSI-style macros for accessing arguments
  8 *       of functions which take a variable number of arguments.
  9 *       [ANSI]
 10 *
 11 *       [Public]
 12 *
 13 ****/
 14
 15 #if     _MSC_VER > 1000
 16 #pragma once
 17 #endif
 18
 19 #ifndef _INC_STDARG
 20 #define _INC_STDARG
 21
 22 #if     !defined(_WIN32) && !defined(_MAC)
 23 #error ERROR: Only Mac or Win32 targets supported!
 24 #endif
 25
 26
 27 #ifdef  _MSC_VER
 28 /*
 29  * Currently, all MS C compilers for Win32 platforms default to 8 byte
 30  * alignment.
 31  */
 32 #pragma pack(push,8)
 33 #endif  /* _MSC_VER */
 34
 35 #ifdef  __cplusplus
 36 extern "C" {
 37 #endif
 38
 39
 40
 41 #ifndef _VA_LIST_DEFINED
 42 #ifdef  _M_ALPHA
 43 typedef struct {
 44         char *a0;       /* pointer to first homed integer argument */
 45         int offset;     /* byte offset of next parameter */
 46 } va_list;
 47 #else
 48 typedef char *  va_list;
 49 #endif
 50 #define _VA_LIST_DEFINED
 51 #endif
 52
 53 #ifdef  _M_IX86
 54
 55
 56 #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
 57
 58 #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
 59 #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
 60 #define va_end(ap)      ( ap = (va_list)0 )
 61
 62 #elif   defined(_M_MRX000)
 63
 64
 65 /* Use these types and definitions if generating code for MIPS */
 66
 67 #define va_start(ap,v) ap  = (va_list)&v + sizeof(v)
 68 #define va_end(list)
 69 #define va_arg(list, mode) ((mode *)(list = 70  (char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) & 71  (__builtin_alignof(mode)<=4?-4:-8))+sizeof(mode))))[-1]
 72
 73 /*  +++++++++++++++++++++++++++++++++++++++++++
 74     Because of parameter passing conventions in C:
 75     use mode=int for char, and short types
 76     use mode=double for float types
 77     use a pointer for array types
 78     +++++++++++++++++++++++++++++++++++++++++++ */
 79
 80
 81 #elif   defined(_M_ALPHA)
 82
 83
 84 /* Use these types and definitions if generating code for ALPHA */
 85
 86 /*
 87  * The Alpha compiler supports two builtin functions that are used to
 88  * implement stdarg/varargs.  The __builtin_va_start function is used
 89  * by va_start to initialize the data structure that locates the next
 90  * argument.  The __builtin_isfloat function is used by va_arg to pick
 91  * which part of the home area a given register argument is stored in.
 92  * The home area is where up to six integer and/or six floating point
 93  * register arguments are stored down (so they can also be referenced
 94  * by a pointer like any arguments passed on the stack).
 95  */
 96
 97 extern void * __builtin_va_start(va_list, ...);
 98
 99 #ifdef  _CFRONT
100 #define __builtin_isfloat(a) __builtin_alignof(a)
101 #endif
102
103 #define va_start(list, v) __builtin_va_start(list, v, 1)
104 #define va_end(list)
105 #define va_arg(list, mode) 106     ( *(        ((list).offset += ((int)sizeof(mode) + 7) & -8) , 107         (mode *)((list).a0 + (list).offset - 108                     ((__builtin_isfloat(mode) && (list).offset <= (6 * 8)) ? 109                         (6 * 8) + 8 : ((int)sizeof(mode) + 7) & -8) 110                 ) 111        ) 112     )
113
114 #elif   defined(_M_PPC)
115
116 /* Microsoft C8 front end (used in Motorola Merged compiler) */
117 /* bytes that a type occupies in the argument list */
118 #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
119 /* return ‘ap‘ adjusted for type ‘t‘ in arglist */
120 #define _ALIGNIT(ap,t) 121         ((((int)(ap))+(sizeof(t)<8?3:7)) & (sizeof(t)<8?~3:~7))
122
123 #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
124 #define va_arg(ap,t)    ( *(t *)((ap = (char *) (_ALIGNIT(ap, t) + _INTSIZEOF(t))) - _INTSIZEOF(t)) )
125 #define va_end(ap)      ( ap = (va_list)0 )
126
127 #elif   defined(_M_M68K)
128 #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
129
130 #define va_start(ap,v)  ( ap = (va_list)&v + (sizeof(v) < sizeof(int) ? sizeof(v) : _INTSIZEOF(v)) )
131 #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
132 #define va_end(ap)      ( ap = (va_list)0 )
133
134 #elif   defined(_M_MPPC)
135 #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
136
137 #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
138 #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
139 #define va_end(ap)      ( ap = (va_list)0 )
140
141 #else
142
143 /* A guess at the proper definitions for other platforms */
144
145 #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
146
147 #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
148 #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
149 #define va_end(ap)      ( ap = (va_list)0 )
150
151
152 #endif
153
154
155 #ifdef  __cplusplus
156 }
157 #endif
158
159 #ifdef  _MSC_VER
160 #pragma pack(pop)
161 #endif  /* _MSC_VER */
162
163 #endif  /* _INC_STDARG */

  

原文地址:https://www.cnblogs.com/jawide/p/10825684.html

时间: 2024-07-31 05:19:22

stdarg.h的相关文章

编写一个可变参数的C函数——头文件stdarg.h中宏va_start ,va_arg和va_end的应用

我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:int printf( const char* format, ...);它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:printf("%d",i);printf("%s",s);printf("the number is %d ,string is:%s", i, s);究竟如何写可变参数的

stdarg.h——用于函数接受可变参数

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数. 1.可变参数函数 声明可变参数函数 可变参数函数的参数数量是可变动的,它使用省略号来忽略之后的参数.例如printf函数一般.代表性的声明为: int check(int a, double b, ...); 可变参数函数最少要有一个命名的参数,所以 char *wrong(...); 在C中是不被允许的(在C++中,这样的声明是合理的

#include&lt;stdarg.h&gt; 可变参数使用

今天上计算方法这课时觉得无聊至极,于是拿出C++编程之道来看了看..无意之中看到了#include<stdarg.h> va_list,va_start,va_end等东西,不知是怎么用的,于是很想解决.. 课后速回到宿舍,打开电脑一查才    知道原来是:定义成一个可变参数列表的指针: 于是写下了下面的一小程序加以运用(开发环境为vs2005) #include<stdio.h>#include<stdarg.h>int N=5;void Stdarg(int a1,

#include &lt;stdarg.h&gt;

名称描述相容  // 作用描述 va_start使va_list指向起始的参数 va_arg检索参数C89 va_end释放va_list va_copy拷贝va_list的内容 实例解析: #include <stdio.h> #include <stdarg.h> void printargs(int arg1, ...) /* 输出所有int类型的参数,直到-1结束 */  //参数列表中, 后面的元素类型不一定,va_arg()函数的返回类型决定的 { va_list ap

头文件&lt;stdarg.h&gt;

头文件<stdarg.h>声明了一种类型并且定义了三个宏,这样就可以提前访问一个参数表,调用函数在被编译时并不知道这个参数表中参数的数目和类型.其目的是是为了让函数能够接受可变参数. 1.类型:va_list 它是一个保存宏va_start.va_arg和va_end所需要的信息的类型.如果要访问不同的参数,那么调用的函数要声明一个va_list类型的数据对象(假设该数据对象名为ap).对象ap可能作为参数传递给另一个函数.如果那个函数对参数ap调用宏va_arg,那么ap在调用函数中的值是不

使用stdarg.h实现可变长度参数

现在先用一个使用过程讲解一下: ◎用法: func( Type para1, Type para2, Type para3, … ) { /****** Step 1 ******/ va_list ap; va_start( ap, para3 ); //一定要“…”之前的那个参数 ,而且这个参数不能使引用类型,因为引用类型不能根据其地址获取后面参数的地址 /****** Step 2 ******/ //此时ap指向第一个可变参数 //调用va_arg取得里面的值 Type xx = va_

#include&lt;stdarg.h&gt;

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数.C++的cstdarg头文件中也提供这样的功能:虽然与C的头文件是兼容的,但是也有冲突存在. VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数 va_start,函数名称,读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一

C 标准库 - &lt;stdarg.h&gt;

C 标准库 - <stdarg.h> 简介 stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数. 可变参数的函数通在参数列表的末尾是使用省略号(,...)定义的. 库变量 下面是头文件 stdarg.h 中定义的变量类型: 序号 变量 & 描述 1 va_list 这是一个适用于 va_start().va_arg() 和 va_end() 这三个宏存储信息的类型. 库宏 下面是头文件 stdarg.h

第 16 章 C 预处理器和 C 库(可变参数:stdarg.h)

1 /*------------------------------------------------- 2 varargs.c -- use variable number of arguments 3 -------------------------------------------------*/ 4 5 #include <stdio.h> 6 #include <stdarg.h> 7 8 double sum(int, ...); 9 10 int main()