C ++中的固定宽度整数

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

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

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

Boost具有适用于所有C99类型的typedef以及更多: “Boost整数库”

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

 #ifdef _MSC_VER typedef __int16 int16_t #else #include  #endif 

包含文件以获取类型为uint16_t的定义。 默认情况下VC ++没有附带 ,但您可以从多个位置获取该文件。 维基百科列出了一些,谷歌会找到更多。

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

是。

正如Mehrdad所说,你现在可以使用#ifdefs 。 另一种选择是一些复杂的模板魔法。 Boost在这个方向上有一些东西, Boost Integer库 。

我使用了mingw包中可用的Danny Smith的stdint.h公共域(不是GPL – 真正的公共域)版本:

我不得不调整那个版本来编译一些非VC 8编译器(主要是VC6) – 它对我有用。

也许有一天我会在某个地方发布我的VC6兼容版本。 这些变化非常小 – 只是为64位类型使用VC6特定关键字的一些宏观技巧。 如果您不需要VC6支持,那么mingw版本可能就是您所需要的。

有不同的路径可以采取。 大多数环境都认为short int是16位, long int是32.(当你声明简单的int时暗示long 。)如果你输入自己的int16类型,你可能最终会使用short int

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

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

等等。 如果你然后定义:

 struct x myvar; myvar.a = 54; 

你可以确定myvar.a将保持16位,myvar.b将使用5; myvar的总大小四舍五入所有位包含的内容,当然还有任何其他字段的大小。