编译时如何禁用部分代码

时间:2019-05-09 06:03:20

标签: c++

场景如下,我有10多个不同的项目都使用日志记录框架,并且在台式机系统和研究项目中,日志记录框架实际记录日志是必需的。但是,我们希望在嵌入式设备中部署相同的代码而不进行日志记录,因为这是不必要的,并且确实会影响性能(许多日志语句)。

我怎么说怎么说编译为桌面=启用日志记录或编译为嵌入式=禁用日志记录?

我看过ifdef,但不确定那是最好的前进方式

我使用waf作为构建系统,如果有帮助,我们使用C ++ 17。

2 个答案:

答案 0 :(得分:12)

您有两个选择:预处理器和源选择。

预处理器是#ifdef,通常是根据平台的不同而定义一个宏,如下所示:

#if defined(EMBEDDED)
#  define LOG(msg)
#else
#  define LOG(msg) log(msg)
#endif

,然后使用宏记录事件:

LOG("I'm here");

宏当然可以更复杂。


从根本上来说,源选择意味着您用具有相同接口但不执行任何操作的替换项替换日志记录库。

源选择更易于管理且使用起来更简洁,但不够灵活或彻底。为了真正减小可执行文件的大小,您可能希望采用预处理器方式。

答案 1 :(得分:2)

选择源仍然可以调用该函数,因此对于嵌入式系统而言,可能不是最优化的。您也许还可以更改路径以启用源选择,而不用将库复制进/出。