这是我用高级编程语言来呵护自己的方法。
我有一个函数,它将32位值写入缓冲区,并在堆栈上写入uint64_t
。以下代码是一种理智的存储方式吗?
uint64_t size = 0;
// ...
getBytes((uint32_t*)&size+0x1);
我认为这将是规范,安全的风格:
uint64_t size = 0;
// ...
uint32_t smallSize;
getBytes(&smallSize);
size = smallSize;
答案 0 :(得分:3)
没有。它只能在big-endian机器上正常工作。假设一个特定的字节顺序 - 甚至没有先检查它 - 是不理智的。
即使您确定您的程序目前仅在大端机器上运行,您也永远不会知道它是否可能在将来运行在小端机器上。 (我是在一家使用大端处理器数十年的公司制造的计算机上写的,几年前改用小端处理器,现在在某些设备中使用双端处理器也非常成功; ))
答案 1 :(得分:0)
为什么不让getBytes()返回uint64_t?并使用参数(例如int *)返回错误代码(如果有的话)。
根据我的个人经验,如果你真的想要统一两个代码路径,那么在两者中使用uint64_t。
另请注意,“(uint32_t *)& size”会破坏C99严格别名规则(例如,在GCC中,必须禁用优化)。