假设我希望编写一个C程序(C99或C2011),我希望它是完全可移植的,并且不依赖于特定的架构。
似乎我想要从旧的整数类型(int
,long
,short
)和朋友那里彻底中断并仅使用 int8_t
,uint8_t
,int32_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
似乎很奇怪,但我很乐意务实。
答案 0 :(得分:9)
假设我想写一个我想成为的C程序(C99或C2011) 完全可移植并且不依赖于特定的架构。
似乎我想要与旧的彻底决裂 整数类型(int,long,short)和朋友,只使用int8_t, uint8_t,int32_t等(也许使用最少和最快 版本)。
这两个大胆的肯定是矛盾的。这是因为uint32_t
,uint8_t
和al是否可用实际上是实现定义的(C11,7.20.1.1/3:精确宽度整数类型)。
如果您希望您的程序真正可移植,则必须使用内置类型(int
,long
等)并坚持C标准中定义的最小范围(即:C11,5.2.4.2.1:整数类型的大小),
例如,标准规定short
和int
的范围应从至少 -32767到至少 32767.所以如果你想要存储更大或更小的值,比如42000,你可以使用long
代替。
答案 1 :(得分:6)
标准要求{C},C99和C11中main
的返回类型为int
。
现在,精确宽度整数类型是整数类型的别名。因此,如果您使用int
的正确别名,它仍然有效。
例如:
int32_t main(void)
如果int32_t
是int
的typedef。