文章出处:http://blog.csdn.net/shift_wwx
sprintf 在填充buffer 的时候,可能需要将buffer 一并的打印出来,一般情况sprintf 之后加个log 就可以了,但是碰到很多应用sprintf的地方就很累了,可以包装起来。
#define SQL_DEBUG 0
#define getSqlParams(func, buffer, args...) \
do{\
sprintf(buffer, ##args);\
if(SQL_DEBUG){\
LOGD("getSqlParams for %s\n", func);\
LOGD("%s = %s\n",#buffer, buffer);\
}\
}while(0)
或者是多加一个函数做一些补充的事情:
#define getSqlParams(func, buffer, args...) sprintf(buffer, ##args);\
temp_add(func, buffer)
宏定义中的省略号就是指一串数目不限的参数列表,前面用args只有为了后面引用这串参数.
至于省略号的用法可以看一下:函数参数中带省略号的用法
来看一下sprintf 的source code:
int
sprintf(char *str, const char *fmt, ...)
{
int ret;
va_list ap;
FILE f;
struct __sfileext fext;
_FILEEXT_SETUP(&f, &fext);
f._file = -1;
f._flags = __SWR | __SSTR;
f._bf._base = f._p = (unsigned char *)str;
f._bf._size = f._w = INT_MAX;
va_start(ap, fmt);
ret = __vfprintf(&f, fmt, ap);
va_end(ap);
*f._p = '\0';
return (ret);
}
进_vfprintf 一看,还是有的晕乎的,后期研究了~~