首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查C++11库特性

检查C++11库特性
EN

Stack Overflow用户
提问于 2012-08-09 15:00:36
回答 2查看 2.9K关注 0票数 9

检查标准库中是否存在特定的特性的好方法是什么。

对于编译器特性,我只是顺便检查了主要编译器(VC++、gcc、clang,也许是Intel)的编译器版本--尽管这不是最好和最灵活的方法,但我还不知道有什么更好的方法,除了具有非常好的__has_feature宏的clang。

但是对于库特性来说,情况就更糟了,它们并不是严格地耦合到编译器上的。目前,我想使用相同的方法来检查VC++的编译器版本(假设它使用自己的库,这非常容易)。对于clang,我至少可以使用__has_include进行大规模的基于头的查询。除此之外,我认为如果定义了__GLIBCXX__值,检查它的值可能是个好主意,但我仍然找不到任何信息,说明引入了哪些特定的libstdc++版本,除了当前版本支持哪些特性。

这些方法应该保持在预处理器检查等,因为我想使用它在一个只有头的库,没有任何诡辩的配置过程,也不使用任何第三方库(是的,boost是第三方)。

  1. 那么,在这些(相当狭窄的)条件下,检查特定的C++11库特性的可能性是什么呢?甚至是在特定函数或类型被声明的范围内?
  2. 如果检查编译器或库版本仍然是最好的方法,那么我在哪里可以找到特定版本的libstdc++所支持的特定特性的详细信息(也许还有其他重要的libc++ )?

FWIW目前我使用的是<cstdint>、C++11 <cmath>函数和std::hash,但这可能会改变,对一般方法可能不重要。

EN

回答 2

Stack Overflow用户

发布于 2012-08-09 15:07:04

除了知道哪个编译器在哪个版本中实现了什么并有正确的定义之外,这里没有什么好的地方可以做。

gcc有一个用于图书馆功能的专用表。当然,__has_include的主要问题是在旧的标准中增加了一些内容。libstdc++也有必要的包含,但这并不意味着需要进行必要的定义来启用这些文件的内容。它也不会告诉您任何关于可用实现的实际数量(有时是不完整的)。

因为您有一个只有头的库,这并不适用于您,但是仍然很重要: C++11和C++03之间的二进制不兼容可能会回来咬你。

我真的不会单独处理这些问题,而是使用Boost.Config。最初,它只描述了语言特性,但现在扩展到了标准库头。

票数 9
EN

Stack Overflow用户

发布于 2012-08-12 20:02:39

您可以编写autoconf宏以进行检查,如果可以,则将它们提交给http://www.gnu.org/software/autoconf-archive/

到目前为止,唯一相关的检查是完全覆盖,而不是单个特性:0x,但这不能满足不需要复杂配置检查的要求。

除此之外,我认为如果定义了__GLIBCXX__值,检查它的值可能是个好主意,

查看__GLIBCXX__的值并不有用,它包含版本发布的日期。几乎没有告诉您有关该版本的任何信息(例如,4.6.3是在4.7.0之后发布的,因此在__GLIBCXX__中有一个较晚的日期,但C++11特性较少)。当与GCC一起使用libstdc++时,您希望使用__GLIBC____GLIBC_MINOR__中的通用GCC版本号来检查版本(一般来说,您只可以使用给定版本的libstdc++,并附带它附带的__GLIBC_MINOR__版本)。

编辑:从GCC 7开始,libstdc++ headers定义了一个新的宏_GLIBCXX_RELEASE,它定义的值与GCC的__GNUC__相同,但即使在使用libstdc++头与非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库的支持我们现在列出了哪个版本首先添加了这个特性,所以您只需要查看最新的docs:https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.201z

目前,我在<cstdint>、C++11 <cmath>函数和std::hash中相互交织

它们应该出现在所有支持任何C++0x/C++11的libstdc++版本中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11886288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档