C++可变参数宏

来源:互联网 发布:2016年十大网络用语 编辑:程序博客网 时间:2024/06/16 15:18

0、如下为一个小例子

#define F(...) printf(__VA_ARGS__)        F("hello\n");          F("count = %d\n", ONE);  

1、一个更加丰富的栗子:

//此处仅作示例,参数数量略少#define LOG(...) Log(#__VA_ARGS__,__VA_ARGS__)  //实现部分//参数str接收的是__VA_ARGS__可变参数拼接成的字符串void Log(std::string str,...){    //定义要存放可变参数的列表 ap    va_list ap;    //初始化可变参数列表的存储地址(可讨论)    va_start(ap, str);    //初次开辟空间大小    int nLen = MAX_LINE_LENGTH;    char *buf = (char *)malloc(nLen);    //接收可变参数中的第一个参数,这里,我们假定是一个字符类型的    //(需要事先知道类型,否则按照字符接收,可能出现显示异常)    //这里我们接收的第一个参数是一个流格式fmt,形如%s%d%c    const char * fmt = va_arg(ap, const char*);    int nSize = 0;    //使用vsnprintf可以很好的避免buf空间不足,出现内存溢出    //按照第一个参数规定的格式,将后续所有的参数一次性接受到buf中    //ps:如果不想这样接收,大可以使用接收第一个参数时的方式(va_arg),接收剩下的参数,    //需要注意的是,必须知道所有参数的类型,和总的参数个数(这时,    //大家一般选择用第一个参数表示后续的参数个数,再使用一个循环,按照事先约定的数据类型依次接收剩下的数据)    while(nSize = vsnprintf(buf, nLen, fmt, ap) < 0)    {         nLen*=2;         //当nSize<0代表空间不足,我们重新为buf开辟一个更大的空间。         buf = (char *)realloc(buf, nLen);     }    str = buf;}

参考:
百度百科-vsnprintf

原创粉丝点击