我们有一个C ++模板库,它具有一些依赖于zlib的功能。
我们使用预处理器符号选择性地启用和禁用功能,即在命令行上设置-DHAVE_ZLIB=1
。
我们的基于CMake的构建系统识别已安装的zlib并将相应的标志添加到编译器。 当然,这也可以由用户使用他们喜欢的IDE或他们的Makefile手动完成。
该库的一个属性是使用zlib的代码与不使用zlib的代码交错,即无论zlib是否存在,使用#include <library/header.h>
都应该有效。
目前,我们#if
输出了依赖于zlib的代码。
因此,例如,如果用户尝试使用类似CompressedStream
的内容,则根本找不到该类。
这对用户来说非常令人沮丧。
构建系统警告他们无法找到zlib,但用户是用户要么看不到,要么快速忘记。
我自己也陷入了这个陷阱。
现在我的问题: 如果用户尝试使用需要zlib的代码,则警告用户zlib处于禁用状态的最佳方法是什么。
我唯一能想到的是使用许多编译器中实现的deprecator标记机制。 虽然每个语法都需要不同的语法,但可以使用预处理器宏轻松地将其抽象出来。 还有其他好方法吗?
解决方案只需在VS&gt; 8,GCC&gt; 4.2和LLVM中工作。
答案 0 :(得分:2)
警告用户关于此类事情的适当位置是(IMO)构建系统。看看Ogre3D,KDE和许多其他项目 - 所有这些项目在构建配置后打印出大纲。该大纲包含有关已发现内容和未发现内容以及后果的信息。
即便是Qt也没有做任何事情来解决这个问题。可以选择使用STL支持构建Qt,如果它没有这样构建,则没有警告或其他任何东西,只编译有关未定义方法的错误。所以,我认为,在编译阶段没有办法警告用户这类事情。