【问题标题】:In C++11 or later is there a way to have a constexpr that determines endian without UB?在 C++11 或更高版本中,有没有办法让 constexpr 在没有 UB 的情况下确定字节序?
【发布时间】:2015-11-19 12:03:58
【问题描述】:

请注意,我发现的早期类似问题是在 C++11 之前和/或包含 UB 和/或不能是 constexpr。

不是重复的 Is there a way to do a C++ style compile-time assertion to determine machine's endianness? 或类似

AFAIK 有 little endianbig endianother。如果other至少我需要不编译,如果可以添加other架构就更好了

constexpr and endianness 较早被询问过,但不包括 other,这会使 other 架构被错误地定义为一个或另一个

基本上我希望能够根据目标架构的字节序专门化 template

【问题讨论】:

  • 你所说的“其他”是指一些奇特的东西,比如中端或混合端或运行时可切换架构?
  • 如下所述,__ORDER_PDP_ENDIAN__ 符合条件
  • 有些架构没有编译时回答问题,因为它是运行时设置。显然,一些 PowerPC 处理器甚至可以按页面进行选择。
  • @mattnewport:C++ 编译器通常以硬件/操作系统组合为目标。您是否知道在 C++ 应用程序运行时字节序会发生变化的这种组合?
  • @HowardHinnant 我只是通过 Wikipedia:en.wikipedia.org/wiki/Endianness#Bi-endian_hardware - 我自己实际上并没有在野外遇到过这样的系统。听起来它们似乎存在,也许在嵌入式系统中。

标签: c++ c++11 c++14


【解决方案1】:

作为我hash_append work 的一部分,我希望提供您所要求的:

https://github.com/HowardHinnant/hash_append/blob/master/endian.h

other 将被检测到:

endian::native != endian::little && endian::native != endian::big

此标头中的第一个 static_assert 目前对于 other 问题不正确,应将其删除。

这个标题很容易为任何给定的平台提供。但当然它不是可移植的,因此最好由你的 std::lib 实现者提供它。

【讨论】:

  • 我希望能在所有架构上的所有兼容编译器上工作的东西。顺便说一句,对于 GNU,似乎也有 __ORDER_PDP_ENDIAN__
  • 是的,我也是。赌注:命名一台机器为__BYTE_ORDER__ == __ORDER_PDP_ENDIAN__,并且存在一个定义__cplusplus >= 201103的编译器。 :-)
  • 我们不会在 SO 上下注,我们会发帖 :) :stackoverflow.com/questions/32218129/…
  • 干得好! :-) 你忽略了赌注的第二部分......呃帖子:__cplusplus >= 201103
  • 第一件事。我希望这可能会出现在某人的回答中。但是,由于缺乏活动,我怀疑我会进入第二部分。至少现在__ORDER_PDP_ENDIAN__ 可以在 SO 上搜索
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2010-12-22
  • 2022-07-13
  • 2015-08-11
  • 2016-03-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多