格式
- C99开始支持如下可变参数宏
#define LOG( format, ... ) fprintf( stdout, format, ##_VA_ARGS_)
- GCC同样支持如下格式
#define LOG( format, args...) fprintf( stdout, format, ##args)
连接符,在展开如将每一个arg展开了arg加上逗号,如果args为空时,##会去掉多余的逗号。
如果只是想将参数考入到缓存,可以使用
vsprintf
将参数展开:
log( format, ...)
{
va_list l;
va_start( l, format );
for(;;)
type value = va_arg( l, arg type);
va_end( l );
}
实现
typedef char* va_list;
//内存对齐,求参数占用内存数
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(n)-1))
#define va_start(ap, v) (ap=(va_list)&v + _INTSIZEOF(v)) //第一个参数地址
#define va_arg(ap, t) (*(t*)((ap += _INTSIZEOF(t)) - _INSTSIZEOF(t)))//下一个参数地址,从地址往低地址。
#define va_end(ap) (ap=(va_list)0)
网友评论