qDebug( "[模块名称] 调试信息 File:%s, Line:%d", __FILE__, __LINE__ );
#define qWiFiDebug(format, ...) qDebug("[WiFi] "format" File:%s, Line:%d, Function:%s", ##__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__);
#define qprint(...) printf(__VA_ARGS__); 其中__VA_ARGS__代表...可变参数
...可变参数的理解
*****************************************************
#define myprintf (...) { printf("[ %s ]" , __FUNCTION__); printf(__VA_ARGS__); printf("\n"); }
#define myprintf(fmt, ...) printf("[ %s ] " fmt, __FUNCTION__, __VA_ARGS__);
#define eprintf(fmt,...) fprintf(stderr, "[%s] %s", __FUNCTION__, fmt, ##__VA_ARGS__)
*****************************************************
__VA_ARGS__ 等同于... 都代表可变化的参数
#define debug(...) printf(__VA_ARGS__)
*****************************************************
##################
VA_ARGS 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。
##################
上面也说了,只有支持C99规范的gcc编译器才有__VA_ARGS__这个宏,如果不是gcc编译器,或者所用的gcc编译器版本不支持__VA_ARGS__宏怎么办? 可参考下面的代码片段,我们换一种做法,可先将可变参数转换成字符串后,再进行输出即可:
void printDebugMsg( const char* format, …)
{
char buffer[DEBUG_BUFFER_MAX_LENGTH + 1]={0};
va_list arg;
va_start (arg, format);
vsnprintf(buffer, DEBUG_BUFFER_MAX_LENGTH, format, arg);
va_end (arg);
printf( “%s”, buffer );
}