格式
- C99開始支持如下可變參數(shù)宏
#define LOG( format, ... ) fprintf( stdout, format, ##_VA_ARGS_)
- GCC同樣支持如下格式
#define LOG( format, args...) fprintf( stdout, format, ##args)
連接符,在展開如將每一個arg展開了arg加上逗號,如果args為空時,##會去掉多余的逗號。
如果只是想將參數(shù)考入到緩存,可以使用
vsprintf
將參數(shù)展開:
log( format, ...)
{
va_list l;
va_start( l, format );
for(;;)
type value = va_arg( l, arg type);
va_end( l );
}
實現(xiàn)
typedef char* va_list;
//內(nèi)存對齊,求參數(shù)占用內(nèi)存數(shù)
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(n)-1))
#define va_start(ap, v) (ap=(va_list)&v + _INTSIZEOF(v)) //第一個參數(shù)地址
#define va_arg(ap, t) (*(t*)((ap += _INTSIZEOF(t)) - _INSTSIZEOF(t)))//下一個參數(shù)地址,從地址往低地址。
#define va_end(ap) (ap=(va_list)0)