2013-02-12 53 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