27

在 C++ 中,固定宽度整数被定义为optional,但我似乎找不到推荐的方法来检查它们是否实际定义。

检查固定宽度整数是否可用的便携式方法是什么?

4

2 回答 2

20

从广义上讲……你没有。

如果您需要使用固定大小的整数类型,那么这意味着您明确需要这些类型具有特定的大小。也就是说,如果您无法获得这些大小的整数,您的代码将无法正常工作。所以你应该只使用它们;如果有人在缺少上述类型的编译器上使用您的代码,那么您的代码将无法编译。这很好,因为如果你的代码编译了,它就不会工作。

如果您实际上不需要固定大小的整数,而只是出于其他原因想要它们,请使用这些int_least_*类型。如果实现可以准确地为您提供该大小,那么least_*类型将具有该大小。

于 2020-01-01T14:34:16.160 回答
19

要确定是否提供了固定宽度的整数类型,您可以检查是否定义了相应的[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 整数类型<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_MAXINT32_MIN不被允许为#define'd。

但请注意,正如@NicolBolas 在另一个答案中所述,可能不需要实际检查。

于 2020-01-01T15:19:39.597 回答