如果在 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++ 模板库中使用了禁用的库功能,则警告用户的主要内容,如果未能解决你的问题,请参考以下文章