如何在编译时确定字节序?

9
我该如何确定编译时所用平台的大小端(字节序)?我已经看到了许多使用强制类型转换和一些依赖于特定平台的选项来在运行时确定大小端的方法。是否有一种可移植或标准的方法来实现这一点?
constexpr bool is_little_endian = ?;

1
请注意,此处提供的解决方案与我在以下链接中提出的重复:https://dev59.com/_XNA5IYBdhLWcg3wVcT6#38141476 - Justin
1
@Justin,这里有一个使用std::endian的答案(https://dev59.com/_XNA5IYBdhLWcg3wVcT6#38141476),但问题并没有明确要求编译时解决方案,似乎被淹没在噪音中。问题本身并不是重复的,当有人提供该答案时,它是否变成了重复的问题? - Ryan Haining
@RyanHaining,老实说,我从来不确定。在这种情况下,我认为这是一个好的重复问题,因为那里的许多答案都提供了编译时解决方案,因为希望编写时检测字节序是该问题的自然扩展。 - Justin
@Justin,是否有其他可移植的编译时解决方案?我只看到另一个使用联合非法的解决方案。如果还有其他解决方案,我会非常感兴趣。 - Ryan Haining
显示剩余3条评论
1个回答

15

C++20在<bit>中增加了std::endian,可以在constexpr上下文中使用。

下面的代码示例

if constexpr (std::endian::native == std::endian::little) {
    std::cout << "litle endian\n";
} else if constexpr(std::endian::native == std::endian::big) {
    std::cout << "big endian\n";
} else {
    std::cout << "something silly\n";
}

* 最初它是 <type_traits>,并且在早期实现中仍然存在。


1
"!= little"并不严格意味着大端序。还有一些不太常见的奇怪字节顺序存在。 - aschepler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接