gpt4 book ai didi

c - 使用 MACROS 禁用功能

转载 作者:太空狗 更新时间:2023-10-29 15:22:43 24 4
gpt4 key购买 nike

在互联网上搜索了很多解决方案后,我决定在这里询问我的解决方案是否合适。

我正在尝试编写一个简单的模块化 C 日志记录库,旨在易于禁用,特别是帮助博士生和研究人员调试算法,尽可能减少日志系统的影响。

我的问题是,我希望库的用户能够在编译时禁用日志系统,从而生成一个日志成本为 0 的可执行文件。

C 代码如下所示:

...
logger_t * logger;

result = logger_init(logger);
if(result == -1) {...}
...

这将简单地初始化记录器。在寻找示例代码时,我检查了 assert.h header ,但在我的案例中,解决方案导致了警告列表。事实上,如果使用宏将 logger_init() 替换为 0,这将导致变量 logger 从未使用过。

出于这个原因,我决定使用这种方法:

int logger_init(logger_t *logger);

#ifndef NLOG /* NLOG not defined -> enable logging */
int logger_init(logger_t *logger) {
...
}
#else /* NLOG defined --> the logging system must be disabled */
#define logger_init(logger) (int)((logger = NULL) == NULL)
#endif /* NLOG */

这不会导致警告,而且我还避免了调用该函数的开销。事实上,我的第一次尝试是这样做的:

int logger_init(logger_t *logger) {
#ifndef NLOG /* NLOG not defined -> enable logging */
...
#endif
return 0;
}

即使我不需要它,也要继续调用该函数。

您认为我的解决方案可以被认为是一个好的解决方案吗?有更好的解决方案吗?

非常感谢,伙计们!干杯,阿曼多

最佳答案

至少在 90 年代,标准的成语是:

#ifndef NLOG
void logger_init(logger_t *logger);
void logger_log(logger_t *logger, ...);
#else
#define logger_init (void)sizeof
#define logger_log (void)sizeof
#endif

请记住,尽管对 sizeof 操作数进行了语法检查,但它们不会被求值。这个技巧也适用于可变参数函数,因为 sizeof 运算符将看到带有多个逗号运算符的表达式:

logger_log(log, 1, 2, 3);

转换为:

(void)sizeof(log, 1, 2, 3);

那些逗号不是分隔参数(sizeof 不是函数而是运算符),但它们是逗号运算符

请注意,我将返回值从 int 更改为 void。没有真正的必要,但返回的 sizeof 几乎没有意义。

关于c - 使用 MACROS 禁用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7711570/

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