繁体   English   中英

使用MACROS禁用功能

[英]Disable functions using MACROS

在互联网上搜索了相当多的解决方案后,我决定在这里询问我的解决方案是否正常。

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

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

C代码看起来像这样:

...
logger_t * logger;

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

这将简单地初始化记录器。 寻找一个示例代码我检查了assert.h头,但是在我的情况下,soulution会产生一个警告列表。 实际上,如果使用宏将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将是无意义的。

您的禁用版本不能只是一个常量:

#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)     0
#endif /* NLOG */

这样,你只需要(在预编译之后): result = 0; 这不应该产生任何警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM