将连续字节转换为其他类型对象的普遍问题可以使用联合在C中解决。由于活动成员定义,这在C ++中是不可能的。
因此,在下面的片段中,实际的“双关语”由C函数完成。我想知道这是否正确?这肯定取决于“extern”关键字的含义。
#include <cstdint>
#include <cstddef>
#include <string.h>
namespace Util {
namespace detail {
union Punn {
std::byte small[sizeof(uint32_t)];
uint32_t big;
};
}
extern "C" {
inline uint32_t read(const Util::detail::Punn* u) {
return u->big;
}
}
}
int main() {
Util::detail::Punn a;
a.small[0] = std::byte{1};
a.small[1] = std::byte{2};
a.small[2] = std::byte{3};
a.small[3] = std::byte{4};
auto x = Util::read(&a);
return x;
}
我知道这个问题的两个真正的保存解决方案是shift或memcpy()。所以,请只使用extern“C”函数来争论上面的代码。 (旁白:生成的汇编代码在g ++上是正确的,但这并不意味着它严格符合。)