我如何知道我的编译器是否支持XXXXC++11功能

How can I know if my compiler support XXXX C++11 feature?

本文关键字:支持 XXXXC++11 功能 是否 编译器 何知道 我的      更新时间:2023-10-16

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

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

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

#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

这存在吗?有图书馆可以这样做吗?


编译器的文档?

让我澄清一下。我知道如何找到这些信息,我的问题在其他地方。我不想浏览所有可能的编译器文档来收集这些信息,尤其是因为同一个编译器可能支持不同版本的功能。这就是我到目前为止一直在做的事情,而我所寻找的实际上是一种不这样做的方法。

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

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

有人讨论过建立一些标准化的特性测试机制,但事实证明这没有任何意义:如果编译器实现了标准,所有特性测试都会产生true。如果没有,就没有理由认为它在功能测试方面遵循了标准!

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

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

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

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

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

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

标准中没有这样的东西。

解决编译器差异的一种实用方法是为您支持的每个编译器和编译器版本提供一个标头。这些标头应该具有相同的名称。包含哪一个取决于包含路径和工具用法,这对于每个编译器来说都很容易自定义。

我将这个概念称为虚拟头。我发现它适用于三个级别:系统依赖性、编译器依赖性和版本依赖性。我认为这个计划的规模不会超过这个,但另一方面,这似乎就是人们所需要的。