例如,我们有一个 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 中工作。
最佳答案
警告用户此类事情的正确位置是 (IMO) 构建系统。看看 Ogre3D、KDE 和许多其他项目——它们都在构建配置后打印出某种轮廓。此大纲包含有关发现的内容和未发现的内容及其后果的信息。
甚至 Qt 也没有做任何事情来解决这个问题。有构建支持 STL 的 Qt 的选项,如果不是这样构建的,则没有警告或其他任何内容,只有关于未定义方法的编译错误。所以,我认为,没有办法在编译阶段就此类事情向用户发出警告。
关于c++ - 如果在 C++ 模板库中使用禁用的库功能,则警告用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10495450/