gpt4 book ai didi

c++ - 如果可用,是否可以使用 std::endian ,否则做其他事情?

转载 作者:行者123 更新时间:2023-12-01 11:55:04 26 4
gpt4 key购买 nike

从 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.



的确!事实上,这就是为什么我们现在有一种全新的方法来检测处于不同发布阶段的编译器的功能支持:功能测试宏!如果你看 SD-FeatureTest , 标准中采用的每种语言和库功能对应的宏都有很大的表,一旦采用了一个功能,每个宏都会用指定的值定义。

在您的特定情况下,您需要 __cpp_lib_endian .

现在库宏的问题是我们在添加放置它们的位置之前就开始添加它们 - 这将是 <version> .如果您使用的编译器具有 <version> (这将是 gcc 9+,带有 libc++ 的 clang 7+,我不知道 MSVC),你可以只包含它。但它可能不会,因此您可能还必须尝试包含正确的标题(在本例中为 <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++ - 如果可用,是否可以使用 std::endian ,否则做其他事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61114929/

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