我有两个不同的宏,其中一个编译得很好,另一个不能:

    #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 Studio2022 C/C++,但我研究了您的代码. 请try :

#define ASSERT(x, ...)    assert_log(x, __FILE__, __LINE__, __VA_ARGS__)
#define TRACE(x, ...)     trace(x, __FILE__, __LINE__, __VA_ARGS__)

希望你能看到不同之处.它是一个小的.您在TRACE之后和(之前添加了一个空格,这会导致错误.

C++相关问答推荐

使用sd-设备列举设备导致seg错误

为什么海湾合作委员会在共享对象中的. init_data的虚拟内存地址之前留出一个空白

修改pGM使用指针填充2-D数组但不起作用

InetPton()函数无效的IP地址

struct -未知大小

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

如何使用C++在控制台中以彩色打印被阻止的客户端

在C中包装两个数组?

如何在C-函数中混合使用C代码和ASM?

使用nmake for程序比Hello World稍微复杂一些

可变宏不能编译

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

生产者消费者计数器意外输出的C代码

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

计算SIZE_MAX元素的长数组的大小

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

GDB 跳过动态加载器代码

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组

Zig 中 C 的system函数的惯用替代方案