C++可变参数宏

格式

  • 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)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。