使用BYTE类型的变量是否可移植?

时间:2014-12-09 10:41:46

标签: c++ visual-studio gcc portability

我注意到windows.h有这个:

 typedef unsigned char BYTE;

我不想使用这个头文件,因为我希望我的代码可以移植。

是否有任何其他头文件以可移植的方式定义BYTE

便携式我的意思是它在Linux系统上编译。

2 个答案:

答案 0 :(得分:1)

根据定义,

unsigned char的大小恰好是一个“字节”。 C和C ++中的“字节”正好是CHAR_BIT位; CHAR_BIT保证至少 8,但它可以更大。

如果您需要一个字节,请使用类型unsigned char。您可以直接使用它,也可以定义自己的typedef,例如

typedef unsigned char byte;

如果你认为它使代码更清晰(我不认为它,但是YMMV)。请注意,您可以使用定义自己的byteBYTE类型的库。

uint8_t<cstdint>中定义的类型<stdint.h>保证是8位的无符号类型。在具有CHAR_BIT > 8的系统上,uint8_t将不存在,因为没有对象(除了位字段)比一个字节更窄。

如果您只关心Windows和Linux的可移植性,则可以依赖CHAR_BIT==8;在这种情况下,使用unsigned charuint8_t

可能无关紧要

如果您希望代码真正可移植,请在需要字节时使用unsigned char,如果需要 octets ,则使用uint8_t按照定义恰好是8位)。

你还没有说明你希望BYTE有什么特征,所以我不能比那更具体。

答案 1 :(得分:0)

包括<cstdint>并使用std::uint8_t(或std::int8_t,如果您认为字节为已签名)。如果要使用其他标识符(例如Byte,而不是std::uint8_t),则可以添加typedef。

#include <cstdint>

typedef std::uint8_t Byte;

...

Byte foo = 0;

这是便携式的事情。在每个主流的现代平台上,unsigned char也总是等同于一个8位字节。