在C ++中,固定宽度的整数定义为optional,但是我似乎找不到建议的方法来检查它们是否确实定义。
检查固定宽度整数是否可用的便携式方法是什么?
cpp
文件并根据编译是否失败,来测试某些语言功能,即是否设置了可以定义的宏。
AC_TYPE_INT8_T
等等
在C ++中,固定宽度的整数定义为optional,但是我似乎找不到建议的方法来检查它们是否确实定义。
检查固定宽度整数是否可用的便携式方法是什么?
cpp
文件并根据编译是否失败,来测试某些语言功能,即是否设置了可以定义的宏。
AC_TYPE_INT8_T
等等
Answers:
要确定是否提供了固定宽度的整数类型,可以检查是否定义了相应的[U]INT*_MAX
或[U]INT*_MIN
宏。
// may be necessary for your C++ implementation
#define __STDC_LIMIT_MACROS
#include <cstdint>
#ifdef INT32_MAX
// int32_t must be available to get here
int32_t some32bitIntVariable;
#endif
根据7.20 Integer类型<stdint.h>
,C11标准的第4段(请注意粗体部分):
对于实现所提供的本文所述的每种类型,
<stdint.h>
应声明该typedef
名称并定义关联的宏。相反,对于本文中描述的实现未提供的每种类型,<stdint.h>
不得声明该typedef
名称,也不得定义相关的宏。
C ++通过继承C实现<cstdint>
。有关详细信息,请参见<cstdint>
vs。<stdint.h>
还看到什么__STDC_LIMIT_MACROS
和__STDC_CONSTANT_MACROS
意味着什么呢?有关的详细信息__STDC_LIMIT_MACROS
。
因此,如果int32_t
是可用的,INT32_MAX
而且INT32_MIN
必须是#define
“d。相反,如果int32_t
不可用,则INT32_MAX
也INT32_MIN
不允许#define
。
但是请注意,正如@NicolBolas在另一个答案中所述,可能没有必要进行实际检查。
[U]INT*_C
而不是检查最小和最大宏
从广义上讲...您没有。
如果您需要使用固定大小的整数类型,则意味着您明确需要这些类型为其特定大小。也就是说,如果您无法获得这些大小的整数,则代码将无法运行。所以你应该只使用它们;如果有人在缺少上述类型的编译器上使用您的代码,则您的代码将无法编译。很好,因为如果编译,您的代码将无法正常工作。
如果您实际上不需要固定大小的整数,而只是出于某些其他原因而想要它们,则请使用这些int_least_*
类型。如果实现可以为您提供确切的大小,则least_*
类型将具有该大小。
uint8_t
),但是此代码需要以某种方式在字节不是8位的平台上运行(除了使用旧的C ++实现,这将是无法使用的唯一原因uint8_t
)?也就是说,出于向后兼容性的原因,为什么需要这样做?
uint8_t
是多比现有的ad-hoc(和经常断)的方式更清晰。
O(1)
与O(n)
努力。人们使用例如的相同原因uint16_t
。您在问“为什么不使用uint32_t自己进行转换?”,答案应该显而易见。
uint16_t
。我的原因是我正在与设备/格式/等进行通信,该设备/格式/等期望使用本机的字节序精确获取16位数据格式为二进制无符号整数,并且如果我无法获得确切地说,要与之有效地沟通要困难得多。我的程序(以及与之配合使用的API)从根本上不能在不提供该程序的计算机上运行。
#if defined(INT8_MIN)