c/c++语言开发共享使用MACROS禁用function

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

我正在尝试编写一个简单的模块化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; 这不应该产生任何警告。

    需要了解更多c/c++开发分享使用MACROS禁用function,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享使用MACROS禁用function相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/980068.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐