9

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

对于编译器功能,我只是顺便检查了(恕我直言)主要编译器(目前VC++gccclang,也许是Intel)的编译器版本虽然这不是最好和最灵活的方法,但我不知道任何更好的东西,除了具有非常好的宏的clang 。__has_feature

但对于与编译器没有那么严格耦合的库特性来说,情况就更糟了。目前,我想使用相同的方法检查VC++的编译器版本(假设它使用自己的库,这很容易)。对于clang,我至少可以__has_include用于大规模的基于标头的查询。除此之外,我想检查__GLIBCXX__'s value if defined 可能是一个好主意,但是我又找不到任何关于特定libstdc++版本引入了哪些功能的信息,除了当前版本支持的内容。

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

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

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

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

4

2 回答 2

9

除了知道哪个编译器在哪个版本中实现了什么并且有适当的定义之外,您在这里真的没有什么好做的。

gcc 有一个用于库功能的特殊表。主要问题__has_include当然是对旧版标准的补充。libstdc++也有必要的包含,但这并不意味着启用这些文件的内容的必要定义。它也不会告诉你任何关于可用实现的实际数量(有时是不完整的)。

由于您有一个仅包含标头的库,因此这不适用于您,但仍然很重要:C++11 和 C++03 之间的二进制不兼容可能会卷土重来。

我真的不会自己解决任何问题,而是使用Boost.Config。最初它只描述语言特性,但现在已扩展到标准库头文件。

于 2012-08-09T15:07:04.613 回答
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__是没有用的,它包含版本发布的日期,这几乎不会告诉您有关版本的任何信息(例如,4.6.3 是在 4.7.0 之后发布的,因此具有较晚的日期,__GLIBCXX__但具有较少的 C++11 功能.) 将 libstdc++ 与 GCC 一起使用时,您希望在__GLIBC____GLIBC_MINOR__检查版本时使用通用 GCC 版本号(通常,您只能将给定版本的 libstdc++ 与它附带的 GCC 版本一起使用。)

编辑:从 GCC 7 开始,libstdc++ 头文件定义了一个新宏_GLIBCXX_RELEASE,它被定义为与 GCC 相同的值__GNUC__,但即使在非 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#状态.iso.201z

FWIW 目前我对<cstdint>C++11<cmath>函数和std::hash

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

于 2012-08-12T20:02:39.533 回答