我有两个不同的宏,其中一个编译得很好,另一个不能:
#define ASSERT(x, ...) assert_log(x, __FILE__, __LINE__, __VA_ARGS__)
#define TRACE (x, ...) trace(x, __FILE__, __LINE__, __VA_ARGS__)
...
libs/defs.h:16:71: error: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro [-Werror]
16 | #define TRACE (x, ...) trace(x, __FILE__, __LINE__, __VA_ARGS__)
| ^
他们宣布的签名:
void assert_log(int, const char*, int, const char* , ...);
void trace(int, const char*, int, const char* , ...);
编译标志:
CFLAGS= \
-Wextra \
-Werror \
-Wall \
-Wfloat-equal \
-Wundef \
-Wshadow \
-Wcast-align \
-Wstrict-prototypes \
-Wswitch-enum \
-Wformat=2 \
-Werror=pointer-arith \
-Wuninitialized \
-pedantic \
-std=c17 \
-DDEBUG=1 \
-g \
-Og
鉴于他们的签名是一样的,我不明白GCC为什么要抱怨?