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