linux-011之stdarg.h標頭檔案
阿新 • • 發佈:2019-01-28
#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