gpt4 book ai didi

c - "too many arguments for format"带宏

转载 作者:行者123 更新时间:2023-12-03 08:36:31 25 4
gpt4 key购买 nike

我有一个调试宏,用于快速而脏的输出。我一直在尝试确定如何使代码在 gcc 5.4 上编译干净。它不会在早期版本的 gcc (4.x) 或 clang (11.0.3) 上出现任何问题。错误是这样的:

main.c: In function ‘main’:
main.c:4:38: warning: too many arguments for format [-Wformat-extra-args]
do { if (1){ fprintf(stdout, "debug:%s:%04d:%s: " fmt, __FILE__, \
^
main.c:10:2: note: in expansion of macro ‘DEBUGPRINT’
DEBUGPRINT("How to have no arguments?\n", NULL);

我一直在尝试确定如何解决此问题的代码是:

#include <stdio.h>

#define DEBUGPRINT(fmt, ...) \
do { if (1){ fprintf(stdout, "debug:%s:%04d:%s: " fmt, __FILE__, \
__LINE__, __func__, __VA_ARGS__);} } while (0)

int main(int argc, char *argv[])
{
DEBUGPRINT("nums: %04i, %04i\n", 0x1234,0x5678);
DEBUGPRINT("How to have no arguments?\n", NULL);
return(0);
}

正如人们所看到的,如果我有争论,那没有问题。仅当我有一条没有参数的消息时才如此。我想我可以用“%s”传递“\n”,但我只是好奇是否有办法处理 NULL。

最佳答案

需要省略 fmt 参数,并且您需要将打印的固定部分与传入的参数分开。

#include <stdio.h>

#define DEBUGPRINT(...) \
do { printf("debug:%s:%04d:%s: ", __FILE__, __LINE__, __func__);\
printf(__VA_ARGS__);\
} while (0)

int main(int argc, char *argv[])
{
DEBUGPRINT("nums: %04i, %04i\n", 0x1234,0x5678);
DEBUGPRINT("How to have no arguments?\n");
return(0);
}

输出:

debug:x1.c:0016:main: nums: 4660, 22136
debug:x1.c:0017:main: How to have no arguments?

关于c - "too many arguments for format"带宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63744509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com