检查标准库中是否存在特定的特性的好方法是什么。
对于编译器特性,我只是顺便检查了主要编译器(VC++、gcc、clang,也许是Intel)的编译器版本--尽管这不是最好和最灵活的方法,但我还不知道有什么更好的方法,除了具有非常好的__has_feature宏的clang。
但是对于库特性来说,情况就更糟了,它们并不是严格地耦合到编译器上的。目前,我想使用相同的方法来检查VC++的编译器版本(假设它使用自己的库,这非常容易)。对于clang,我至少可以使用__has_include进行大规模的基于头的查询。除此之外,我认为如果定义了__GLIBCXX__值,检查它的值可能是个好主意,但我仍然找不到任何信息,说明引入了哪些特定的libstdc++版本,除了当前版本支持哪些特性。
这些方法应该保持在预处理器检查等,因为我想使用它在一个只有头的库,没有任何诡辩的配置过程,也不使用任何第三方库(是的,boost是第三方)。
FWIW目前我使用的是<cstdint>、C++11 <cmath>函数和std::hash,但这可能会改变,对一般方法可能不重要。
发布于 2012-08-09 15:07:04
除了知道哪个编译器在哪个版本中实现了什么并有正确的定义之外,这里没有什么好的地方可以做。
gcc有一个用于图书馆功能的专用表。当然,__has_include的主要问题是在旧的标准中增加了一些内容。libstdc++也有必要的包含,但这并不意味着需要进行必要的定义来启用这些文件的内容。它也不会告诉您任何关于可用实现的实际数量(有时是不完整的)。
因为您有一个只有头的库,这并不适用于您,但是仍然很重要: C++11和C++03之间的二进制不兼容可能会回来咬你。
我真的不会单独处理这些问题,而是使用Boost.Config。最初,它只描述了语言特性,但现在扩展到了标准库头。
发布于 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++版本中。
https://stackoverflow.com/questions/11886288
复制相似问题