19

有时我需要使用固定宽度的整数与 PLC 等外部设备进行通信。我还使用它们来定义位掩码并执行图像数据的位操作。AFAIK C99 标准定义了固定宽度的整数,如 int16_t。但是我使用的编译器 VC++ 2008 不支持 C99 并且 AFAIK 微软不打算支持它。

我的问题是在 C++ 中使用固定宽度整数的最佳做法是什么?

我知道 VC++ 定义了像 __int16 这样的非标准固定宽度整数,但我对使用非标准类型犹豫不决。下一个 C++ 标准会定义固定宽度的整数吗?

4

6 回答 6

18

#ifdef您可以使用一些指令来解决问题。

#ifdef _MSC_VER
   typedef __int16 int16_t
#else
   #include <stdint.h>
#endif
于 2009-04-09T15:47:05.263 回答
12

Boost 具有所有 C99 类型和更多类型的 typedef: “Boost integer library”

于 2009-04-09T15:52:39.867 回答
7

包含该文件<stdint.h>以获取类型的定义,例如uint16_t. VC++ 默认不附带<stdint.h>,但您可以从多个地方获取该文件。 维基百科列出了一些,谷歌会找到更多。

于 2009-04-09T15:50:31.353 回答
3

下一个 C++ 标准会定义固定宽度的整数吗?

是的。

正如 Mehrdad 所说,您#ifdefs现在可以使用。另一种选择是一些精心制作的模板魔术。Boost 在这个方向上有了一些东西,Boost Integer library

于 2009-04-09T15:50:38.687 回答
1

我使用了stdint.hmingw 包中提供的 Danny Smith 的公共领域(不是 GPL - 真正的公共领域)版本:

我不得不调整该版本以使用一些非 VC 8 编译器(主要是 VC6)进行编译——它对我很有帮助。

也许有一天我会在某个地方发布我的 VC6 兼容版本。更改非常小——只是一些宏技巧将 VC6 特定关键字用于 64 位类型。如果您不需要 VC6 支持,mingw 版本可能就是您所需要的。

于 2009-04-09T16:09:54.630 回答
0

有不同的路径可供选择。大多数环境会认为short ints 是 16 位,而long ints 是 32 位。(long当您简单地int声明.typedefshort int

另一种可能性在于结构中的位字段。你可以这样说:

struct x {
    int a : 16;
    int b : 5;
    ...
};

等等。如果您随后定义:

struct x myvar;
myvar.a = 54;

您可以确定 myvar.a 将保存 16 位,而 myvar.b 将使用 5;myvar 的总大小四舍五入为所有位组成,当然还有任何其他字段的大小。

于 2009-04-09T15:52:30.537 回答