2015-11-23 47 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行。

相關問題