有时我需要使用固定宽度的整数与外部设备(如PLC)进行通信。我还使用它们来定义位掩码和执行图像数据的位操作。C99标准定义了固定宽度的整数,如int16_t。然而,我使用的编译器,VC++ 2008不支持C99和AFAIK微软不打算支持它。我的问题是在C中使用固定宽度整数的最佳实践是什么?我知道VC定义了非标准的固定宽度整数,比如__int16,但我不太愿意使用非标准类型。下一个C++标准会定义固定宽度的整数吗?
gmxoilav1#
您可以使用一些#ifdef指令来解决这个问题。
#ifdef
#ifdef _MSC_VER typedef __int16 int16_t #else #include <stdint.h> #endif
字符串
ruoxqz4g2#
Boost具有所有C99类型的typedef以及更多类型:"Boost integer library"
7xllpg7q3#
包含文件<stdint.h>以获取uint16_t等类型的定义。VC++默认情况下不附带<stdint.h>,但您可以从多个位置获取该文件。维基百科列出了一些,谷歌会找到更多。
<stdint.h>
uint16_t
6ovsh4lw4#
下一个C++标准会定义固定宽度的整数吗?是:C++11 has fixed-width integers。正如Mehrdad所说,您现在可以使用#ifdefs。另一种选择是一些精心制作的模板魔术。Boost在这个方向上有一些东西,Boost Integer library。
#ifdefs
pbpqsu0x5#
我使用了Danny Smith的stdint.h的公共域(不是GPL -真正的公共域)版本,该版本在mingw包中可用:
stdint.h
我不得不调整那个版本,以便用一些非VC 8编译器(主要是VC6)编译-它对我很有帮助。也许有一天我会在某个地方发布我的VC6兼容版本。这些变化非常小--只是一些宏技巧,为64位类型使用VC6特定的关键字。如果你不需要VC6支持,mingw版本可能就是你所需要的。
lyfkaqu16#
有不同的道路可走。大多数环境会认为short int是16位,而long int是32位。(当你简单地声明int时,long是隐含的。)如果你typedef你自己的int 16类型,你可能最终会使用short int。另一种可能性在于结构中的位字段。你可以这样说:
short int
long int
int
long
typedef
struct x { int a : 16; int b : 5; ... };
字符串诸如此类。如果您定义:
struct x myvar; myvar.a = 54;
型你可以确定myvar. a将保存16位,myvar.b将使用5位;所有比特所包括的Myvar舍入的总大小,当然加上任何其它字段的大小。
6条答案
按热度按时间gmxoilav1#
您可以使用一些
#ifdef
指令来解决这个问题。字符串
ruoxqz4g2#
Boost具有所有C99类型的typedef以及更多类型:"Boost integer library"
7xllpg7q3#
包含文件
<stdint.h>
以获取uint16_t
等类型的定义。VC++默认情况下不附带<stdint.h>
,但您可以从多个位置获取该文件。维基百科列出了一些,谷歌会找到更多。6ovsh4lw4#
下一个C++标准会定义固定宽度的整数吗?
是:C++11 has fixed-width integers。
正如Mehrdad所说,您现在可以使用
#ifdefs
。另一种选择是一些精心制作的模板魔术。Boost在这个方向上有一些东西,Boost Integer library。pbpqsu0x5#
我使用了Danny Smith的
stdint.h
的公共域(不是GPL -真正的公共域)版本,该版本在mingw包中可用:我不得不调整那个版本,以便用一些非VC 8编译器(主要是VC6)编译-它对我很有帮助。
也许有一天我会在某个地方发布我的VC6兼容版本。这些变化非常小--只是一些宏技巧,为64位类型使用VC6特定的关键字。如果你不需要VC6支持,mingw版本可能就是你所需要的。
lyfkaqu16#
有不同的道路可走。大多数环境会认为
short int
是16位,而long int
是32位。(当你简单地声明int
时,long
是隐含的。)如果你typedef
你自己的int 16类型,你可能最终会使用short int
。另一种可能性在于结构中的位字段。你可以这样说:
字符串
诸如此类。如果您定义:
型
你可以确定myvar. a将保存16位,myvar.b将使用5位;所有比特所包括的Myvar舍入的总大小,当然加上任何其它字段的大小。