2015-11-23 15 views
3

有没有一种简单的方法可以确保数据类型在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相对来说比较新,所以如果我错过了一些超级简单的东西,请原谅我。

+2

@Dieter:感谢您清理那些垃圾。 –

+0

是否有某些原因导致您无法使用宽度特定类型'int8_t','int16_t'等? – shuttle87

+0

@ shuttle87:不是那些类型的非标准吗? –

回答

4

是的。使用在<cstdint>定义的fixed width integer type,通常执行下列操作之一:

int8_t 
int16_t 
int32_t 
int64_t 
uint8_t 
uint16_t 
uint32_t 
uint64_t 

也有其他的不同的使用情况。它们自C++ 11起可用。

+0

我非常肯定那些是非标准的。 'unistd.h库的所有部分? –

+0

你说得对,他们在C++ 11之前是非标准的。 – emlai

+0

谢谢你清理。但是,我不确定它是否适用于Arduino IDE(C++ 98?)。 –

5

甲合理现代C++实现应该具有的标题<cstdint>,它提供intN_tuintN_t,其中N是8,16,32和64使用的那些明确定义的类型将保证要么代码将编译并表现为希望,或不编译,所以你不会得到“我的代码没有做我期望的32位整数”的问题。对于超便携性,你可以使用`int_

在不具有<cstdint>一个系统,也可以实现同样的事情例如基于一些适当的typedef什么编译器(如#if defined(__GCC__) && define(__i386__) ...或一些补充文件挂羊头卖狗肉取样各种预期类型的​​大小,然后生成正确的typedef行。

相关问题