C++:函数参数不确定时用cstdarg(stdarg.h)
| ◎用法: ????? //如果有多個參數繼續調用va_arg ????? /****** Step 3 ******/ ◎研究: #define va_start _crt_va_start #define _crt_va_start(ap,v)??? ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) 最后,用va_end(ap),給ap初始化,保持健壯性。 ? example:(chenguiming) #include??? <stdio.h>??? |
?
?
Linux下的stdarg.h
#ifndef _STDARG_H
#define _STDARG_H
typedef char *va_list; /* 定義va_list 是一個字符指針類型*/
/* Amount of space required in an argument list for an arg of type TYPE.
TYPE may alternatively be an expression whose type is used. */
/* 下面給出了類型為TYPE 的arg 參數列表所要求的空間容量。
TYPE 也可以是使用該類型的一個表達式 */
// 下面這句定義了取整后的TYPE 類型的字節長度值。是int 長度(4)的倍數。
#define __va_rounded_size(TYPE) \
(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
// 下面這個函數(用宏實現)使AP 指向傳給函數的可變參數表的第一個參數。
// 在第一次調用va_arg 或va_end 之前,必須首先調用該函數。
// 17 行上的__builtin_saveregs()是在gcc 的庫程序libgcc2.c 中定義的,用于保存寄存器。
// 它的說明可參見gcc 手冊章節“Target Description Macros”中的
// “Implementing the Varargs Macros”小節。
#ifndef __sparc__
#define va_start(AP, LASTARG) \
(AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
#else
#define va_start(AP, LASTARG) \
(__builtin_saveregs (), \
AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
#endif
// 下面該宏用于被調用函數完成一次正常返回。va_end 可以修改AP 使其在重新調用
// va_start 之前不能被使用。va_end 必須在va_arg 讀完所有的參數后再被調用。
void va_end (va_list); /* Defined in gnulib *//* 在gnulib 中定義 */
#define va_end(AP)
// 下面該宏用于擴展表達式使其與下一個被傳遞參數具有相同的類型和值。
// 對于缺省值,va_arg 可以用字符、無符號字符和浮點類型。
// 在第一次使用va_arg 時,它返回表中的第一個參數,后續的每次調用都將返回表中的
// 下一個參數。這是通過先訪問AP,然后把它增加以指向下一項來實現的。
// va_arg 使用TYPE 來完成訪問和定位下一項,每調用一次va_arg,它就修改AP 以指示
// 表中的下一參數。
#define va_arg(AP, TYPE) \
(AP += __va_rounded_size (TYPE), \
*((TYPE *) (AP - __va_rounded_size (TYPE))))
#endif /* _STDARG_H */
轉載于:https://www.cnblogs.com/mywolrd/archive/2008/11/19/1930716.html
總結
以上是生活随笔為你收集整理的C++:函数参数不确定时用cstdarg(stdarg.h)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车发动机参数指标含义
- 下一篇: c++ 重载 覆盖 隐藏的区别和执行方式