检查C ++ 11库功能

时间:2012-08-09 15:00:36

标签: c++ visual-c++ c++11 libstdc++ libc++

检查标准库的特定C ++ 11功能是否存在的好方法。

对于编译器功能,我只是检查(IMHO)主编译器的编译器版本( VC ++ gcc clang 目前,也许英特尔)虽然这不是最好和最灵活的方法,但我还不知道有什么更好的,除了 clang 之外不错的__has_feature宏。

但是对于库特性来说更糟糕,它们并没有严格地与编译器耦合。目前我想使用相同的方法来检查 VC ++ 的编译器版本(假设它使用自己的库,它非常简单)。对于 clang ,我至少可以使用__has_include进行大规模的基于标头的查询。除此之外,我想检查__GLIBCXX__的值如果被定义可能是一个好主意,但我再也找不到任何特定 libstdc ++ 版本引入哪些功能的信息,除了当前版本支持。

这些方法应该保留给预处理器检查等,因为我想在没有任何复杂的配置过程的情况下在只有头的库中使用它而不使用任何第三方库(是的, boost 是第三方)。

  1. 那么在这些(非常狭窄的)条件下检查特定C ++ 11库特征的可能性是什么。甚至可能是在宣布的特定功能或类型的规模上?

  2. 如果检查编译器或库版本仍然是最好的方法,我在哪里可以找到有关 特定版本支持的特定C ++ 11功能的详细信息libstdc ++ (也许还有其他重要的, libc ++ )?

  3. FWIW目前我对<cstdint>,C ++ 11 <cmath>函数和std::hash感兴趣,但这可能会改变,对于一般方法可能并不重要。

2 个答案:

答案 0 :(得分:9)

除了知道哪个版本的哪个编译器实现了什么并且具有适当的定义之外,你真的没有什么可以做的。

gcc的库功能special table__has_include的主要问题当然是生活在旧标准中的标准的补充。 libstdc++也有必要的包含,但这并不意味着必须定义以启用这些文件的内容。它也不会告诉你任何可用实现的实际数量(有时不完整)。

由于您有一个仅限标题的库,这不适用于您,但仍然很重要:C ++ 11和C ++ 03之间的二进制不兼容性可以回来并咬你。

我真的不会自己接近任何一个而是使用Boost.Config。最初它只描述了语言功能,但现在已经扩展到标准库头。

答案 1 :(得分:4)

可以编写autoconf宏来检查,如果你这样做,请将它们提交给http://www.gnu.org/software/autoconf-archive/
到目前为止唯一相关的检查是完整的覆盖范围,而不是单个功能:http://www.gnu.org/software/autoconf-archive/ax_cxx_header_stdcxx_0x.html#ax_cxx_header_stdcxx_0x 但这不需要复杂的配置检查。

  

除此之外,我想如果定义了__GLIBCXX__的值可能是一个好主意,

查看__GLIBCXX__的值没有用,it contains the date the version was released几乎没有告诉你版本(例如4.6.3是在4.7.0之后发布的,因此在{{1但是具有较少的C ++ 11特性。)当使用libstdc ++和GCC时,你想使用__GLIBCXX____GLIBC__中的通用GCC版本号来检查版本(通常你只能使用给定的libstdc ++的版本,附带GCC版本。)

编辑:从GCC 7开始,libstdc ++标头__GLIBC_MINOR__定义了一个新宏,它被定义为与GCC的_GLIBCXX_RELEASE相同的值,但是即使在非GCC编译器中使用libstdc ++头文件时仍然可以使用。

  

但是我再一次找不到任何特定libstdc ++版本引入哪些功能的信息,而不是当前版本支持的功能。

以前版本的libstdc ++ C ++ 11状态表可在线获取所有GCC文档:http://gcc.gnu.org/onlinedocs/

对于4.7,它位于http://gcc.gnu.org/onlinedocs/gcc-4.7.1/libstdc++/manual/manual/status.html#status.iso.2011,而4.6位于http://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/manual/manual/status.html#status.iso.200x,并且以前的版本包含在源代码中(但是4.6之前的版本中的覆盖率无论如何都非常不完整。)

每个版本的发行说明中列出了一些添加的功能,例如: http://gcc.gnu.org/gcc-4.7/changes.html(在libstdc ++部分中)

修改:对于C ++ 17库支持,我们现在列出首次添加该功能的版本,因此您只需查看最新文档:https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.201z

  

FWIW目前我对__GNUC__,C ++ 11 <cstdint>函数和<cmath>

感兴趣

它们应该存在于任何支持C ++ 0x / C ++ 11的libstdc ++版本中。