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

如果在C+中使用禁用的库功能,则警告用户+;模板库 我们有一个C++模板库,它具有一些依赖于ZLIB的特性。 我们使用预处理器符号有选择地启用和禁用功能,即在命令行上设置-DHAVE_ZLIB=1,c++,cross-platform,cmake,c-preprocessor,C++,Cross Platform,Cmake,C Preprocessor,我们基于CMake的构建系统识别已安装的zlib,并向编译器添加相应的标志。 当然,这也可以由用户使用他们喜欢的IDE或Makefiles手动完成 该库的一个特性是,使用zlib的代码与不使用zlib的代码交错,即无论zlib是否存在,使用#include都应该有效 目前,我们#if输出了依赖于zlib的代码。 因此,例如,如果用户尝试使用类似于压缩流的内容,则根本找不到该类。 这对用户来说相当令人沮丧。 构建系统警告他们无法找到zlib,但是作为用户的用户要么看不到,要么很快就忘记了。 我自己

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

该库的一个特性是,使用zlib的代码与不使用zlib的代码交错,即无论zlib是否存在,使用
#include
都应该有效

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

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

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


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

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


即使是Qt也不要做任何事情来解决这个问题。有一个选项可以使用STL支持构建Qt,如果它不是以这种方式构建的,则不会出现警告或其他问题,只会编译有关未定义方法的错误。因此,我认为,在编译阶段没有办法警告用户这类事情。

你不能简单地检查zlib的预处理器符号(不太可能改变)并发出一个
#错误
,如果
HAVE\u zlib==1
,但这个符号没有定义吗?@sbi:这将检测到
HAVE\u zlib
的错误使用,但这并不是OP想要的:如果zlib不存在,他不想完全删除一个类,而是想保留这个类,但当他试图使用它时会警告用户。@LucTouraille:哦,那我一定是看错了。抱歉。为什么不添加一个打印警告的伪类(或默认模板专门化)?然后,您可以使用#ifdefs在启用zlib的版本和虚拟类之间切换。这就足够了,还是有更多的要求?@Andre只有在使用该类时,您才会发出警告?