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



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

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

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

这个程序所做的只是打印任意整数数据类型的大小并退出。在我的机器上,它将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板上,它只返回2(与我机器上的short大小相同)。

是否可以制作一个(最好是跨平台)标头或声明,以确保数据类型的大小是一定的大小,从而避免遇到精度问题或非常大的数字问题?

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

我对Arduino和整个Arduino IDE都比较陌生,所以如果我错过了一些超级简单的东西,请原谅我。

一个相当现代的C++实现应该具有头<cstdint>,它提供intN_tuintN_t,其中N是8、16、32和64。使用这些定义良好的类型可以保证代码按照您的意愿进行编译和行为,或者不进行编译,这样您就不会遇到"我的代码没有实现我对32位整数的期望"的问题。为了实现超级便携性,您可以使用`int_

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

是。使用<cstdint>中定义的固定宽度整数类型,通常为以下类型之一:

int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t

对于不同的用例,还有其他一些。它们从C++11开始提供。

相关内容

最新更新