有时我需要使用固定宽度的整数与 PLC 等外部设备进行通信。我还使用它们来定义位掩码并执行图像数据的位操作。AFAIK C99 标准定义了固定宽度的整数,如 int16_t。但是我使用的编译器 VC++ 2008 不支持 C99 并且 AFAIK 微软不打算支持它。
我的问题是在 C++ 中使用固定宽度整数的最佳做法是什么?
我知道 VC++ 定义了像 __int16 这样的非标准固定宽度整数,但我对使用非标准类型犹豫不决。下一个 C++ 标准会定义固定宽度的整数吗?
有时我需要使用固定宽度的整数与 PLC 等外部设备进行通信。我还使用它们来定义位掩码并执行图像数据的位操作。AFAIK C99 标准定义了固定宽度的整数,如 int16_t。但是我使用的编译器 VC++ 2008 不支持 C99 并且 AFAIK 微软不打算支持它。
我的问题是在 C++ 中使用固定宽度整数的最佳做法是什么?
我知道 VC++ 定义了像 __int16 这样的非标准固定宽度整数,但我对使用非标准类型犹豫不决。下一个 C++ 标准会定义固定宽度的整数吗?
#ifdef
您可以使用一些指令来解决问题。
#ifdef _MSC_VER
typedef __int16 int16_t
#else
#include <stdint.h>
#endif
Boost 具有所有 C99 类型和更多类型的 typedef: “Boost integer library”
包含该文件<stdint.h>
以获取类型的定义,例如uint16_t
. VC++ 默认不附带<stdint.h>
,但您可以从多个地方获取该文件。 维基百科列出了一些,谷歌会找到更多。
下一个 C++ 标准会定义固定宽度的整数吗?
是的。
正如 Mehrdad 所说,您#ifdefs
现在可以使用。另一种选择是一些精心制作的模板魔术。Boost 在这个方向上有了一些东西,Boost Integer library。
我使用了stdint.h
mingw 包中提供的 Danny Smith 的公共领域(不是 GPL - 真正的公共领域)版本:
我不得不调整该版本以使用一些非 VC 8 编译器(主要是 VC6)进行编译——它对我很有帮助。
也许有一天我会在某个地方发布我的 VC6 兼容版本。更改非常小——只是一些宏技巧将 VC6 特定关键字用于 64 位类型。如果您不需要 VC6 支持,mingw 版本可能就是您所需要的。
有不同的路径可供选择。大多数环境会认为short int
s 是 16 位,而long int
s 是 32 位。(long
当您简单地int
声明.typedef
short int
另一种可能性在于结构中的位字段。你可以这样说:
struct x {
int a : 16;
int b : 5;
...
};
等等。如果您随后定义:
struct x myvar;
myvar.a = 54;
您可以确定 myvar.a 将保存 16 位,而 myvar.b 将使用 5;myvar 的总大小四舍五入为所有位组成,当然还有任何其他字段的大小。