gpt4 book ai didi

c - 宏定义

转载 作者:太空狗 更新时间:2023-10-29 16:09:09 26 4
gpt4 key购买 nike

我试图定义一个功能如下的宏。 Call 1没有问题,但是Call 2提示编译错误,因为第3个参数不可用。如何定义同时支持调用 1 和调用 2 的宏?

#define RDF_LOG(dbglevel, fmt, ...) (rdfDBG(dbglevel, " " fmt, __VA_ARGS__))
void rdfDBG(int dbglevel, const char *fmt, ...) { /* printf debug message */ }

RDF_LOG(kERROR, "Fail to open file %s\n", pinfile); /* Call 1 */
RDF_LOG(kERROR, "Insufficient Memory\n"); /* call 2 , compiler -> error: expected expression before ')' token */

最佳答案

您在第二个宏扩展中得到了一个额外的逗号,因为您在宏定义中的 fmt 之后有一个无条件逗号。

从宏定义中删除 fmt 参数似乎可以解决问题;然后格式字符串成为 __VA_ARGS__ 的一部分:

#define RDF_LOG(dbglevel, ...) (rdfDBG(dbglevel, " " __VA_ARGS__))
void rdfDBG(int dbglevel, const char *fmt, ...) { /* printf debug message */ }

RDF_LOG(kERROR, "Fail to open file %s\n", pinfile); /* Call 1 */
RDF_LOG(kERROR, "Insufficient Memory\n");

这扩展为:

void rdfDBG(int dbglevel, const char *fmt, ...) { }

(rdfDBG(kERROR, " " "Fail to open file %s\n", pinfile));
(rdfDBG(kERROR, " " "Insufficient Memory\n"));

顺便说一下,"" 似乎旨在要求格式为字符串文字(我的修改版本保留了这一点)。你确定要这样做吗?尽管这种情况很少见,但使用非文字格式字符串还是很有用的。

关于c - 宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788850/

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