如何确保数据类型与 C++ 中需要的一样大

How to make sure a data type is as large as it needs to be in C++

在 C/C++ 中,是否有一种简单的方法可以确保数据类型在不同平台和体系结构中保持相同的大小?

在 C++ 中,假设我编写了一个假设的基本程序:

#include <iostream>

int foo;

int main(void)
{
    std::cout<<"Size of foo is "<<sizeof(foo)<<" bytes."<<std::endl;
    return 0;
}

这个程序所做的只是打印任意整数数据类型的大小并退出。在我的机器上,returns foo 的大小为 4 个字节(我有一台 64 位机器)。

但是,假设我为 Arduino 或其他 ATMega 供电板编写了这个程序:

int foo;
void setup()
{
    Serial.begin(9600);
    Serial.print("Size of foo is ");
    Serial.print(sizeof(foo));
    Serial.println(" bytes.");
}
void loop(){}

在我的 Arduino UNO 板上,这只有 returns 2(与我机器上的 short 大小相同)。

是否可以做一个(最好是跨平台的)header或declaration来确保数据类型的大小是一定的大小,以免运行陷入精度问题或与非常大的数字?

理想情况下,这不仅适用于 Arduino 板,还适用于其他紧凑型 MCU(如 PicKit)。

总的来说,我对 Arduino 和整个 Arduino IDE 比较陌生,所以如果我遗漏了一些非常简单的东西,请原谅我。

是的。使用 <cstdint> 中定义的 fixed width integer type,通常是以下之一:

int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t

还有其他针对不同用例的。它们从 C++11 开始可用。

一个相当现代的 C++ 实现应该有头文件 <cstdint>,它提供 intN_tuintN_t,其中 N 是 8、16、32 和 64。使用这些明确定义的类型将保证代码要么编译并按照您的意愿运行,要么不编译,因此您不会遇到 "my code isn't doing what I expect from a 32-bit integer" 的问题。为了超级便携,你可以使用 `int_

在没有 <cstdint> 的系统中,您可以使用一些合适的 typedef 来实现同样的事情,例如基于什么编译器(例如 #if defined(__GCC__) && define(__i386__) ... 或某些 make-对各种预期类型的​​大小进行采样然后生成正确的 typedef 行的文件技巧。