gcc-5.4.0
编译,没有出现任何问题:% gcc -W -Wall a.c
...
#include <stdio.h>
#include <stdarg.h>
static int debug_flag;
static void debug(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
}
#define DEBUG(...) \
do { \
if (debug_flag) { \
debug("DEBUG:"__VA_ARGS__); \
} \
} while(0)
int main(void)
{
int dummy = 10;
debug_flag = 1;
DEBUG("debug msg dummy=%d\n", dummy);
return 0;
}
然而,使用g++
编译会产生有趣的影响:
% g++ -W -Wall -std=c++11 a.c
a.c: In function ‘int main()’:
a.c:18:10: error: unable to find string literal operator ‘operator""__VA_ARGS__’ with ‘const char [8]’, ‘long unsigned int’ arguments
debug("DEBUG: "__VA_ARGS__); \
% g++ -W -Wall -std=c++0x
<same error>
% g++ -W -Wall -std=c++03
<no errors>
将debug("DEBUG:"__VA_ARGS__);
更改为debug("DEBUG:" __VA_ARGS__);
,即在__VA_ARGS__
之前加上空格,可以使代码在所有三个-std=
选项下编译通过。
这种行为的原因是什么呢?谢谢。
DEBUG_PRINTF()
实现。 - Gabriel Staples