基本介绍:
__VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持。
如下定义
#ifndef USE_LOG
#define LOG(fmt, ...) do { fprintf(stderr, fmt, ##__VA_ARGS__) ; } while(0)
#else
#define LOG(fmt, ...) do { if (fp) fprintf(fp, fmt, ##__VA_ARGS__) ; } while(0)
#endif
前面加上拼接宏 ## 的作用在于,当可变参数的个数为0时例如LOG("OK"),这里的##起到把前面多余的","去掉的作用,否则会编译出错。
如果不是gcc编译器,或者所用的gcc编译器版本不支持__VA_ARGS__宏, 可以采用下面的方法。
#define LOG( const char* format, ...) \
{ \
char buffer[1024 + 1]={0}; \
va_list arg; \
va_start (arg, format); \
vsnprintf(buffer, 1024, format, arg); \
va_end (arg); \
printf( "%s", buffer ); \
}
int vsnprintf (char * s, size_t n, const char * format, va_list arg );
参数n指示缓存区间的长度,所以格式化产生的字符串最大长度是 n - 1, 留下一个空间存储结束字符 \0 。在任何情况下参数arg都应该在调用之前由 va_start()进行初始化,在调用后由va_end()进行释放。
常用的预定义的宏还有:
__FILE__ 宏在预编译时会替换成当前的源文件名
__LINE__ 宏在预编译时会替换成当前的行号
__FUNCTION__ 宏在预编译时会替换成当前的函数名称
参考资料
函数vsnprintf()基本介绍 http://www.cplusplus.com/reference/cstdio/vsnprintf/点击打开链接