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


25

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

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


似乎没有功能测试宏,但我想您可以做到#if defined(INT8_MIN)
Zereges

2
如果std库没有为此提供功能测试宏,则可以检查所使用的工具链是否为此提供了功能,或者允许您定义自己的测试。例如,CMake允许您通过编译定义的cpp文件并根据编译是否失败,来测试某些语言功能,即是否设置了可以定义的宏。
t.niese

如果您更喜欢autoconf而不是cmake,则它已经为它们预定义了测试。AC_TYPE_INT8_T等等
肖恩

如果有人在stdint中有任何标签分数,则应提名IMO cstdint作为同义词(stackoverflow.com/tags/stdint/synonyms)。对于这种晦涩难懂的事情,我不认为我们需要单独的C和C ++标签。问题上的主要标签就足够了。
Peter Cordes

1
@PeterCordes这次工作了: stackoverflow.com/tags/stdint/synonyms
Andrew Henle

Answers:


16

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

但是请注意,正如@NicolBolas在另一个答案中所述,可能没有必要进行实际检查。


它会缩短检查时间,[U]INT*_C而不是检查最小和最大宏
phuclv

1
@phuclv除非那不是同一回事。例如INT64_C,定义是否int64_least_t可用,而不是int64_t可用。请参阅文档
在轨道

19

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

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

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


4
这不是真的 我已经为以前不支持uint8_t的平台编写了实现operator = / etc的存根直通。但是出于效率和调试目的,除非实际需要,否则您不希望使用传递。
TLW

@TLW:“ 我已经为不支持uint8_t的平台编写了实现operator = / etc的存根直通。 ”好吧,但是...为什么呢?您编写的是什么代码,需要确定一个字节为8位(这可能是您使用的原因uint8_t),但是此代码需要以某种方式在字节不是8位的平台上运行(除了使用旧的C ++实现,这将是无法使用的唯一原因uint8_t)?也就是说,出于向后兼容性的原因,为什么需要这样做?
Nicol Bolas

专有的,所以不能说太多。共享的代码库需要支持(其中包括)相当古怪的硬件堆栈。uint8_t比现有的ad-hoc(和经常断)的方式更清晰。
TLW

如果您有一个用8位字节表示的算法,则直通仅需编写一次即可轻松测试。而固定每个地方都是临时性的,容易被误解。O(1)O(n)努力。人们使用例如的相同原因uint16_t。您在问“为什么不使用uint32_t自己进行转换?”,答案应该显而易见。
TLW

@TLW:“ 人们使用uint16_t的原因相同。 ”这不是使用的原因uint16_t。我的原因是我正在与设备/格式/等进行通信,该设备/格式/等期望使用本机的字节序精确获取16位数据格式为二进制无符号整数,并且如果我无法获得确切地说,要与之有效地沟通要困难得多。我的程序(以及与之配合使用的API)从根本上不能在不提供该程序的计算机上运行。
Nicol Bolas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.