如何检查是否定义了固定宽度的整数

How to check if fixed width integers are defined

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

检查固定宽度整数是否可用的可移植方法是什么?

从广义上讲......你没有。

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

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

要确定是否提供了固定宽度的整数类型,您可以检查是否定义了相应的 [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

Per 7.20 Integer types <stdint.h>, paragraph 4 of the C11 standard(注意粗体部分):

For each type described herein that the implementation provides, <stdint.h> shall declare that typedef name and define the associated macros. Conversely, for each type described herein that the implementation does not provide, <stdint.h> shall not declare that typedef name nor shall it define the associated macros.

C++ 通过<cstdint> 继承了 C 实现。有关 __STDC_LIMIT_MACROS.

的详细信息,请参阅 <cstdint> vs <stdint.h> for some details. Also see What do __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS mean?

因此,如果 int32_t 可用,INT32_MAXINT32_MIN 必须 #define。相反,如果 int32_t 不可用,则 INT32_MAXINT32_MIN 都不允许 #define

不过请注意,,可能没有必要实际检查。