偶尔我需要使用固定宽度的整数与PLC等外部设备进行通信。我还使用它们来定义位掩码并执行图像数据的位操作。 AFAIK C99标准定义了像int16_t这样的固定宽度整数。但是我使用的编译器,VC ++ 2008不支持C99和AFAIK微软不打算支持它。
我的问题是在C ++中使用固定宽度整数的最佳做法是什么?
我知道VC ++定义了非标准的固定宽度整数,如__int16,但我对使用非标准类型犹豫不决。下一个C ++标准是否会定义固定宽度的整数?
答案 0 :(得分:18)
您可以使用某些#ifdef
指令解决问题。
#ifdef _MSC_VER
typedef __int16 int16_t
#else
#include <stdint.h>
#endif
答案 1 :(得分:12)
Boost具有适用于所有C99类型的typedef以及更多: "Boost integer library"
答案 2 :(得分:7)
包含文件<stdint.h>
以获取uint16_t
等类型的定义。默认情况下,VC ++不附带<stdint.h>
,但您可以从多个位置获取该文件。 Wikipedia列出了一些,Google会找到更多。
答案 3 :(得分:3)
下一个C ++标准是否会定义固定宽度的整数?
是
正如Mehrdad所说,你现在可以使用#ifdefs
。另一种选择是一些复杂的模板魔法。 Boost已朝这个方向发展,Boost Integer library。
答案 4 :(得分:1)
我使用了mnyw包中提供的Danny Smith的公共域(不是GPL - 真正的公共域)版stdint.h
:
我不得不调整那个版本来编译一些非VC 8编译器(主要是VC6) - 它对我有用。
也许有一天我会在某个地方发布我的VC6兼容版本。这些变化非常小 - 只是为64位类型使用VC6特定关键字的一些宏观技巧。如果您不需要VC6支持,那么mingw版本可能就是您所需要的全部内容。
答案 5 :(得分:0)
有不同的路径可供选择。大多数环境都认为short int
是16位,long int
是32。(当你声明long
时,隐含int
。)如果你{{1你自己的int16类型,你最终可能会使用typedef
。
另一种可能性在于结构中的位字段。你可以这样说:
short int
等等。如果你然后定义:
struct x {
int a : 16;
int b : 5;
...
};
你可以确定myvar.a将保留16位,myvar.b将使用5; myvar的总大小随着所有比特的变化而变化,当然还有其他任何字段的大小。