如果可用,是否可以使用 std::endian ,否则做其他事情?
Is it possible to use std::endian if it is available, otherwise do something else?
从 C++20 开始我们可以有:
constexpr bool is_little_endian = std::endian::native == std::endian::little;
如果可用,我希望有代码执行此操作,否则执行运行时检测。这可能吗?
代码可能如下所示:
template<bool b = std_endian_exists_v> constexpr bool is_little_endian;
template<> constexpr bool is_little_endian<true> = std::endian::native == std::endian::little;
template<> constexpr bool is_little_endian<false> = runtime_detection();
我知道可以通过预处理器测试 __cplusplus
,但是编译器在各个阶段逐步加入 C++20 支持,因此这在任何一个方向上都不是可靠的指标。
I am aware that testing __cplusplus
via preprocessor is possible, however compilers phase in C++20 support in various stages so this is not a reliable indicator in either direction.
确实如此!事实上,这就是为什么我们现在有一种全新的方法来检测处于不同发布阶段的编译器的功能支持:feature-test 宏!如果你看一下SD-FeatureTest,标准中采用的每种语言和库特性都有大量宏表,一旦采用一种特性,每个宏都会用指定的值定义。
在您的具体情况下,您需要 __cpp_lib_endian
。
现在库宏的问题是我们开始添加它们之前我们添加了一个地方来放置它们 - 即<version>
。如果您使用的编译器具有 <version>
(即 gcc 9+、clang 7+ 和 libc++,而且我不知道 MSVC),您可以只包含它。但它可能不会,因此您可能还必须尝试包含正确的 header(在本例中为 <bit>
)。
#if __has_include(<bit>)
# include <bit>
# ifdef __cpp_lib_endian
# define HAS_ENDIAN 1
# endif
#endif
#ifdef HAS_ENDIAN
constexpr bool is_little_endian = std::endian::native == std::endian::little;
#else
constexpr bool is_little_endian = /* ... figure it out ... */;
#endif
尽管这样做可能更好:
#ifdef HAS_ENDIAN
using my_endian = std::endian;
#else
enum class my_endian {
// copy some existing implementation
};
#endif
constexpr bool is_little_endian = my_endian::native == my_endian::little;
从 C++20 开始我们可以有:
constexpr bool is_little_endian = std::endian::native == std::endian::little;
如果可用,我希望有代码执行此操作,否则执行运行时检测。这可能吗?
代码可能如下所示:
template<bool b = std_endian_exists_v> constexpr bool is_little_endian;
template<> constexpr bool is_little_endian<true> = std::endian::native == std::endian::little;
template<> constexpr bool is_little_endian<false> = runtime_detection();
我知道可以通过预处理器测试 __cplusplus
,但是编译器在各个阶段逐步加入 C++20 支持,因此这在任何一个方向上都不是可靠的指标。
I am aware that testing
__cplusplus
via preprocessor is possible, however compilers phase in C++20 support in various stages so this is not a reliable indicator in either direction.
确实如此!事实上,这就是为什么我们现在有一种全新的方法来检测处于不同发布阶段的编译器的功能支持:feature-test 宏!如果你看一下SD-FeatureTest,标准中采用的每种语言和库特性都有大量宏表,一旦采用一种特性,每个宏都会用指定的值定义。
在您的具体情况下,您需要 __cpp_lib_endian
。
现在库宏的问题是我们开始添加它们之前我们添加了一个地方来放置它们 - 即<version>
。如果您使用的编译器具有 <version>
(即 gcc 9+、clang 7+ 和 libc++,而且我不知道 MSVC),您可以只包含它。但它可能不会,因此您可能还必须尝试包含正确的 header(在本例中为 <bit>
)。
#if __has_include(<bit>)
# include <bit>
# ifdef __cpp_lib_endian
# define HAS_ENDIAN 1
# endif
#endif
#ifdef HAS_ENDIAN
constexpr bool is_little_endian = std::endian::native == std::endian::little;
#else
constexpr bool is_little_endian = /* ... figure it out ... */;
#endif
尽管这样做可能更好:
#ifdef HAS_ENDIAN
using my_endian = std::endian;
#else
enum class my_endian {
// copy some existing implementation
};
#endif
constexpr bool is_little_endian = my_endian::native == my_endian::little;