1. 程式人生 > >linux-011之stdarg.h標頭檔案

linux-011之stdarg.h標頭檔案

#ifndef _STDARG_H
#define _STDARG_H

typedef char * va_list;				//定義va_list是一個字元型別指標

/*
*取整後的TYPE型別的位元組長度值,是int長度(4)的倍數
*/
#define _va_rounded_size(TYPE) \
(((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int))

/*
*下面這個函式使AP指向傳給函式的可變引數的第一個引數
*在第一次呼叫va_arg或va_end之前,先呼叫該函式
*_builtin_saceregs是gcc庫程式libgcc2定義的,用於
*儲存暫存器
*/
#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);
#define va_end(AP)


/*
*第一次使用va_arg時,返回表中的第一個引數,後續的每次呼叫都將
*返回表中的下一個引數.這是通過先訪問AP,然後把他增加以指向下
*一項來實現的
*/
#define va_arg(AP,TYPE)		\
(AP += _va_rounded_size(TYPE),(*(TYPE*)(AP-_va_rounded_size(\  TYPE))))

#endif