3

例如,我们有一个 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 中工作。

4

1 回答 1

2

警告用户此类事情的适当位置是(IMO)构建系统。看看 Ogre3D、KDE ​​和许多其他项目——它们都在构建配置后打印出某种轮廓。本大纲包含有关发现什么、没有发现什么以及由此产生的后果的信息。

甚至 Qt 也没有解决这个问题。可以选择使用 STL 支持构建 Qt,如果不是以这种方式构建,则没有警告或其他任何内容,只会编译有关未定义方法的错误。所以,我认为,在编译阶段没有办法警告用户这些事情。

于 2012-05-08T09:28:29.707 回答