我有 2 个可变宏,其中一个可以正常编译,另一个则不能:
#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为什么要抱怨?
我使用 Visual Studio 2022 C/C++,但我查看了你的代码。 请尝试:
#define ASSERT(x, ...) assert_log(x, __FILE__, __LINE__, __VA_ARGS__)
#define TRACE(x, ...) trace(x, __FILE__, __LINE__, __VA_ARGS__)
希望您能看到其中的差异。它是一个小号。您在
TRACE
之后和 (
之前添加了一个空格,这导致了错误。