例如,我们有一个 C++ 模板库,它有一些依赖于 zlib 的特性。我们使用预处理器符号选择性地启用和禁用功能,即-DHAVE_ZLIB=1
在命令行上设置。
我们基于 CMake 的构建系统识别已安装的 zlib 并将相应的标志添加到编译器。当然,这也可以由用户手动完成,使用他们最喜欢的 IDE 或他们的 Makefile。
该库的一个特性是使用 zlib 的代码与不使用 zlib 的代码交错,即#include <library/header.h>
无论 zlib 是否存在,使用都应该工作。
目前,我们#if
输出了依赖于 zlib 的代码。因此,如果用户尝试使用类似的东西CompressedStream
,例如,根本找不到该类。这对用户来说是相当令人沮丧的。构建系统警告他们找不到 zlib,但作为用户的用户要么看不到这一点,要么很快就忘记了。我自己也掉进了这个陷阱。
现在我的问题是:如果用户尝试使用需要 zlib 的代码,那么警告用户 zlib 已禁用的最佳方法是什么?
我唯一能想到的是使用许多编译器中实现的弃用标记机制。尽管它们中的每一个都需要不同的语法,但可以使用预处理器宏轻松地将其抽象出来。有没有其他好办法?
该解决方案只需要在 VS >8、GCC >4.2 和 LLVM 中工作。