gpt4 book ai didi

c++ - '_HAS_CXX17' 宏是否可用于自定义项目 header 以启用 C++17 语言集功能?

转载 作者:太空狗 更新时间:2023-10-29 22:55:24 25 4
gpt4 key购买 nike

我想创建使用标准 C++ 中的“可选”的 header 。但是,我的 header 将从 Visual Studio 2015 和 Visual Studio 2017 项目中引用。

我想要一些东西,例如对于 Visual Studio 2017(具有 C++ 17 语言功能集),使用 std::optional,对于 Visual Studio 2015,使用 boost::optional。

我在想这样的事情:

#include <yvals.h>
#if _HAS_CXX17
#include <optional>
template <typename T> using Optional = std::optional<T>;
#else
#include "boost/optional/optional.hpp"
template <typename T> using Optional = boost::optional<T>;
#endif

可以这样使用“_HAS_CXX17”宏吗?有更好的方法吗?

最佳答案

简短的回答是: 在 Visual C++ 运行时的实现中依赖内部预处理器定义是不安全的,从技术上讲,所有以单个 _ 开头的编译器符号都是如此。保留供实现使用。

例如,_NOEXCEPT已在Visual Studio 2015和2017内部使用,但截至VS 2017(15.8更新),该宏已不存在;标题只使用 noexcept直接。

使用建议__has_include很好,但在 VS 2017(15.3 更新)之前不受支持。

另一个挑战是 __cplusplus并不表示您正在使用 /std:c++17除非您将 VS 2017(15.7 更新)与新的 /Zc:__cplusplus 一起使用默认关闭的开关。

在一系列 VS 版本中执行此操作的最安全方法可能是:

#if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L) && (_MSC_VER >= 1913))
#if __has_include(<optional>)
#include <optional>
template <typename T> using Optional = std::optional<T>;
#else
#include "boost/optional/optional.hpp"
template <typename T> using Optional = boost::optional<T>;
#endif
#else
#include "boost/optional/optional.hpp"
template <typename T> using Optional = boost::optional<T>;
#endif

See Visual C++ Language Conformance

关于c++ - '_HAS_CXX17' 宏是否可用于自定义项目 header 以启用 C++17 语言集功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52379233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com