文章出处: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 一看,还是有的晕乎的,后期研究了~~