C ++中的固定宽度整数

时间:2009-04-09 15:44:49

标签: c++ c visual-c++ types portability

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

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

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

6 个答案:

答案 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的总大小随着所有比特的变化而变化,当然还有其他任何字段的大小。