是否使用 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)。请注意,您可能会使用定义了自己的 byteBYTE 类型的库。

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

如果你只关心 Windows 和 Linux 的可移植性,你可以依赖CHAR_BIT==8;在这种情况下,使用unsigned charuint8_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 中制作可移植的可选依赖项?

__COUNTER__ 宏是不是可移植?

java(而)变量

数据类型

用于 Fortran 的 mex 网关中 REAL 变量的可移植声明

使用 wmemset() 的代码的可移植性如何?