2013-02-12 63 views
4

假設我想編寫一個C程序(C99或C2011),我希望它是完全可移植的,而不是綁定到特定的體系結構。C中的整數類型

看來,我會那麼想從舊的整數類型(intlongshort)和朋友一刀兩斷,並使用只有int8_tuint8_tint32_t等(也許使用的least和以及fast版本)。

然後是main的返回類型是什麼?或必須我們要與int?標準要求是否爲int

GCC-4.2讓我寫

#include <stdint.h> 
#include <stdio.h> 
int32_t main() { 
    printf("Hello\n"); 
    return 0; 
} 

,但我不能使用uint32_t甚至int8_t因爲那時我得到

hello.c:3: warning: return type of ‘main’ is not ‘int’ 

這是因爲一個typedef,毫無疑問的。看起來這是一種情況,我們不得不使用未指定的大小類型,因爲它不是真正的可移植的,除非我們將返回類型留給目標架構。這個解釋是否正確?在代碼庫中只有一個普通的舊版本int似乎很奇怪,但我很樂意實用。

+4

使用'int'作爲'main()'的返回類型,你會發現什麼樣的可移植性問題? – JasonD 2013-02-12 14:52:02

+0

從任何機器上編譯的意義來說,int都是可移植的。現在,如果你說要嘗試返回12344567891233445567,那麼你會遇到問題,但讓我們老實說,你最後一次這樣做了嗎?所有返回的數字都應該相當小。例如錯誤代碼。 – 2013-02-12 14:53:39

+0

我意識到在這種情況下使用'int'使得程序可移植,而在其他地方,似乎可移植性要求使用固定大小的類型。也許這只是一個必要的不對稱。 – 2013-02-12 14:54:42

回答

9

假設我要編寫我想 完全可移植,而不是依賴於特定的體系結構的C程序(C99或C2011)。

看來然後,我會想使從舊 整數類型(int,長,短)和朋友一刀兩斷,並且只使用中int8_t, uint8_t,int32_t等(也許使用的至少和快速的 版本)。

這兩個粗體的肯定是矛盾的。這是因爲uint32_t,uint8_t和al是否可用實際上是實現定義的(C11,7.20.1.1/3:精確寬度整數類型)。

如果你希望你的程序是真正的便攜,您必須使用內置類型(intlong等),並堅持在C標準定義的最小範圍(即:C11,5.2.4.2。1:大小整數類型)的,

每例如,標準說,這兩個shortint應爲至少 -32767至至少 32767。所以,如果要存儲一個較大或較低的價值,比如說42000,你會用long代替。

6

標準要求main的返回類型爲C89,C99和C11中的int

現在,精確寬度的整數類型是整數類型的別名。因此,如果您使用int的正確別名,它仍然有效。

例如:

int32_t main(void) 

int32_t如果是一個typedef到int

+0

我想盡可能多,但無法找到免費版本的C99或C11標準。我能找到的最新免費贈品是2005年的[這一款](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf)。 – 2013-02-12 14:53:29

+1

您可以找到C99的最新草稿這裏:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf和C11的最新草案在這裏:http://www.open-std.org/jtc1/sc22 /wg14/www/docs/n1570.pdf – ouah 2013-02-12 14:56:26