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

标签 c++ cross-platform cmake c-preprocessor

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

最佳答案

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

甚至 Qt 也没有做任何事情来解决这个问题。有构建支持 STL 的 Qt 的选项,如果不是这样构建的,则没有警告或其他任何内容,只有关于未定义方法的编译错误。所以,我认为,没有办法在编译阶段就此类事情向用户发出警告。

关于c++ - 如果在 C++ 模板库中使用禁用的库功能,则警告用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10495450/

相关文章:

c++ - OpenSSL 使用 Cmake 从源代码编译?

makefile - CheckCXXCompilerFlag 或 CheckCCompilerFlag 一次检查一组标志

c++ - 我的 lambda 在复制构造期间没有正确转换捕获的 'this'

cross-platform - 根据 config_setting 创建不同的规则

c++ - 图标作为基础出现在窗口内的怪异图标

c++ - 将 UTF-8 字符转换为大写/小写 C++

android - 构建 CMake 时 Ninja 出现错误

CMake 检查主项目是否被调用

c++ - 模板的合格和不合格名称查找的不同行为

c++ - 如何生成具有预定义*唯一性*的整数序列?