如果在 C++ 模板库中使用了禁用的库功能,则警告用户

Posted

技术标签:

【中文标题】如果在 C++ 模板库中使用了禁用的库功能,则警告用户【英文标题】:Warning users if disabled library features are used in a C++ template library 【发布时间】:2012-05-08 08:51:25 【问题描述】:

例如,我们有一个 C++ 模板库,它具有一些依赖于 zlib 的功能。 我们使用预处理器符号选择性地启用和禁用功能,即在命令行上设置-DHAVE_ZLIB=1

我们基于 CMake 的构建系统识别已安装的 zlib,并将相应的标志添加到编译器。 当然,这也可以由用户手动完成,使用他们最喜欢的 IDE 或他们的 Makefile。

该库的一个属性是使用 zlib 的代码与不使用 zlib 的代码交错,即无论 zlib 是否存在,使用 #include <library/header.h> 都应该工作。

目前,我们#if 输出依赖于 zlib 的代码。 因此,例如,如果用户尝试使用CompressedStream 之类的东西,则根本找不到该类。 这对用户来说是相当令人沮丧的。 构建系统警告他们找不到 zlib,但作为用户的用户要么看不到这一点,要么很快就忘记了。 我自己也掉进了这个陷阱。

现在我的问题是: 如果用户尝试使用需要 zlib 的代码,警告用户 zlib 已禁用的最佳方法是什么。

我唯一能想到的就是使用许多编译器中实现的弃用标记机制。 尽管它们中的每一个都需要不同的语法,但可以使用预处理器宏轻松地将其抽象出来。 还有什么好办法吗?

该解决方案只需要在 VS >8、GCC >4.2 和 LLVM 中工作。

【问题讨论】:

您不能简单地检查 zlib 的预处理器符号(不太可能更改)并在 HAVE_ZLIB==1 时发出 #error,但该符号未定义? @sbi:这会检测到 HAVE_ZLIB 的不正确使用,但这不是 OP 想要的:如果 zlib 不存在,他不想完全删除一个类,而是想保留这个类但是当他尝试使用它时会警告用户。 @LucTouraille:哦,那我一定是看错了。对不起。 为什么不添加一个打印警告的虚拟类(或默认模板专业化)?然后,您可以使用 #ifdefs 在启用 zlib 的版本和虚拟类之间切换。这是否足够,还是有更多要求? @Andre 只有在使用类时才会发出警告? 【参考方案1】:

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

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

【讨论】:

以上是关于如果在 C++ 模板库中使用了禁用的库功能,则警告用户的主要内容,如果未能解决你的问题,请参考以下文章

如果蓝牙关闭 iOS,则禁用警告对话框

如何禁用 msvc c++ 编译器的“注意:”提示

c++ boost库中累加器的用途是啥?

如果 XIB 在 DLL / 库中,则加载视图时出错

混合 C 和 C++ 的库/链接器问题

C++:禁用隐式转换警告