是否使用 BYTE 可移植类型的变量?
Posted
技术标签:
【中文标题】是否使用 BYTE 可移植类型的变量?【英文标题】:Is using a variable of type BYTE portable? 【发布时间】:2014-12-09 10:41:45 【问题描述】:我注意到windows.h
有这个:
typedef unsigned char BYTE;
我不想使用这个头文件,因为我希望我的代码是可移植的。
是否有任何其他以可移植方式定义 BYTE
的头文件?
我所说的可移植是指它可以在 Linux 系统上编译。
【问题讨论】:
如果您可以在自己的代码中插入 typedef,为什么还需要外部头文件? 只需使用unsigned char
。
【参考方案1】:
unsigned char
根据定义正好是一个“字节”大小。 C 和 C++ 中的“字节”正好是 CHAR_BIT
位; CHAR_BIT
保证至少 8,但可以更大。
如果您需要一个字节,请使用类型unsigned char
。可以直接使用,也可以自己定义typedef
如
typedef unsigned char byte;
如果您认为它使代码更清晰(我不认为它会,但是 YMMV)。请注意,您可能会使用定义了自己的 byte
或 BYTE
类型的库。
在<cstdint>
或<stdint.h>
中定义的uint8_t
类型保证为正好8 位的无符号类型。在具有CHAR_BIT > 8
的系统上,uint8_t
将不存在,因为没有比一个字节窄的对象(位字段除外)。
如果你只关心 Windows 和 Linux 的可移植性,你可以依赖CHAR_BIT==8
;在这种情况下,使用unsigned char
或uint8_t
可能并不重要。
如果您希望您的代码真正可移植,如果您需要字节,请使用unsigned char
,如果您需要八位字节,请使用uint8_t
(根据定义,这正是8 位)。
你还没有说你希望BYTE
具有什么特征,所以我不能说得更具体了。
【讨论】:
@mans:标准 C 头文件(包含在 C++ 中)的名称格式为<foobar.h>
。它们在全局命名空间中定义符号(当从 C++ 中使用时,它们可能会或可能不会在 std::
下定义相同的符号)。这些头文件的 C++ 版本的名称格式为 <cfoobar>
。它们在 std::
命名空间中定义符号(并且可能会或可能不会在全局命名空间中定义相同的符号)。要么是这样,要么是我误解了某些东西,C++ 专家会马上纠正我。【参考方案2】:
包括<cstdint>
并使用std::uint8_t
(或std::int8_t
,如果您认为字节是有符号的)。如果您想使用不同的标识符,可以添加 typedef,例如 Byte
,而不是 std::uint8_t
。
#include <cstdint>
typedef std::uint8_t Byte;
...
Byte foo = 0;
这是最便携的事情。在每个主流的现代平台上,unsigned char
也总是相当于一个 8 位字节。
【讨论】:
以上是关于是否使用 BYTE 可移植类型的变量?的主要内容,如果未能解决你的问题,请参考以下文章
是否有一种可移植的方式在 Makefile 中制作可移植的可选依赖项?