如何使用C++测试功能支持

How do I test for feature support with C++?

本文关键字:功能 支持 测试 C++ 何使用      更新时间:2023-10-16

我正在尝试使用带有g++6.3.1和-std=c++17标志的::std::optional<T>。事实证明,我必须实际使用#include <experimental/optional>,而使用::std::experimental::optional<T>。我该如何测试这一点,以便在功能真正包含在标准库中后可以包含正确的标题?

有没有一个选项我可以给g++,让它包括"实验"功能,就像它们是标准的一样?

您可以使用特性测试建议中的__cpp_lib_experimental_optional

简而言之,这里的故事是,gcc有一个习惯,就是成为各种位的"早期采用者",这些位被提议包含在即将到来的C++标准修订版中,但在这些位被正式采用之前。

当然,不能保证gcc中这些位的实现最终会在没有任何后续调整的情况下出现在最终的C++标准中。因此,它们被释放为<experimental/optional>,而不是<optional>

您可以预期,在gcc的未来版本中,这个头文件将被重命名为<optional>,可能需要进行任何最终调整,使其与C++标准中的最终规范相匹配。

可以直接将自己的头文件和翻译单元写入#include <experimental/optional>而不是#include <optional>。没有编译器开关可以为您执行此操作。当您将编译器升级到实现最终C++标准规范的新版本,并具有实际的<optional>头文件时,您可以简单地相应地更新源代码。

您还可以在源树中放置一个名为optional的存根文件,其中只包含一个:

#include <experimental/optional>

然后添加一个-I .编译选项,以便#include <...>也能在当前目录中查找;然后参考来源中的#include <optional>

-I .将找到这个存根,它将拉入experimental/optional。稍后更新gcc时,只需删除此文件和-I .选项即可。

更多信息