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的总大小四舍五入所有位包含的内容,当然还有任何其他字段的大小。