可变宏无法编译

问题描述 投票:0回答:1

我有 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为什么要抱怨?

c preprocessor variadic-macros
1个回答
0
投票

我使用 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
之后和
(
之前添加了一个空格,这导致了错误。

© www.soinside.com 2019 - 2024. All rights reserved.