4

可能重复:
如何检查 C++11 支持?

我正在编写一个小型库,并且只要编译器支持它们,我就想使用类枚举。我还想使用其他 C++11 功能,例如finaloverride关键字。

到目前为止,我已经使用技巧来确保它可以在所有版本的 GCC 上编译,但是当我启动我的 Windows 分区时,Visual Studio 2010 也开始抱怨。这是我使用的技巧的一个示例:

#if __GNUC__ == 4 && (__GNUC_MINOR__ > 7 || \
      (__GNUC_MINOR__ == 7 && __GNUC_PATCHLEVEL__ > 1))
#   define TATO_OVERRIDE override
#   define TATO_NO_THROW nothrow
#else
#   define TATO_OVERRIDE
#   define TATO_NO_THROW throw()
#endif

我知道最新版本的 Visual Studio 也已经支持了一批新功能。我想要的是一组宏,它告诉我正在使用的编译器上有哪些功能可用。

#ifdef THIS_COMPILER_SUPPORTS_CLASS_ENUMS
  ...
#endif

这存在吗?有没有这样做的图书馆?


编译器的文档?

让我澄清一下。我知道如何找到这些信息,我的问题在别处。我不想通过所有可能的编译器文档来收集这些信息,特别是因为同一个编译器可能支持与其版本相关的不同功能。这就是我迄今为止一直在做的事情,而我正在寻找的实际上是一种不这样做的方法。

4

4 回答 4

4

Boost 实际上有很多这样的宏可用。你可以用那个。否则,唯一的方法是从本质上检查编译器的版本,并使用您对该版本支持的功能的了解来确定某个功能是否可用。

本质上,Boost 所做的,除了手动。

于 2012-10-10T14:47:36.510 回答
3

曾经讨论过有一些标准化的功能测试机制,但事实证明这没有任何意义:如果编译器实现了标准,所有的功能测试都会产生true. 如果不是,就没有理由假设它在功能测试方面遵循标准!

因此,使用某种配置文件似乎是最可靠的方法。就个人而言,我会以与显式检查编译器版本不同的方式来做这件事:相反,我会使用一些东西来尝试编译器是否在可接受的程度上支持特定功能。配置可以按照autoconf或类似的方式运行。

关于生成的配置,我会尝试将事物映射到合适的结构,而不是在配置头之外使用条件编译。例如,我会使用这样的东西:

#if defined(KUHL_HAS_CLASS_FINAL)
#  define kuhl_class_final final
#else
#  define kuhl_class_final
#endif

特别是对于类枚举,您可能需要使用一些有点棘手的东西,因为枚举值仅在范围内可用,而值仅在范围外可用。因此,可能需要在一种情况下提出某种形式的额外嵌套,但在另一种情况下则不然。

于 2012-10-10T14:42:45.650 回答
1

clang 有一些用于各种功能检查的内置宏:clang 功能检查宏 如果所有编译器供应商都接受这些(以及更多),那就太好了。

于 2012-10-10T14:40:43.823 回答
0

“我想要的是一组宏,它告诉我正在使用的编译器上有哪些功能可用。”

标准中没有这样的东西。

编译器差异的一种实用方法是为您支持的每个编译器和编译器版本提供一个标头。这些标头应具有相同的名称。包含哪一个取决于包含路径、工具使用情况,这很容易为每个编译器定制。

我把这个概念称为虚拟标题。我发现它适用于三个级别:系统依赖、编译器依赖和版本依赖。我认为该计划不会扩大到更多,但另一方面,这似乎就是人们所需要的。

于 2012-10-10T14:36:15.457 回答