假设我希望编写一个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;
}
Run Code Online (Sandbox Code Playgroud)
但我不能使用uint32_t,甚至int8_t因为我得到了
hello.c:3: warning: return type of ‘main’ is not ‘int’
Run Code Online (Sandbox Code Playgroud)
这是因为typedef,毫无疑问.看来这是我们不得不使用未指定大小类型的一种情况,因为它不是真正可移植的,除非我们将返回类型留给目标体系结构.这种解释是否正确?int在代码库中只有"只有一个"的旧版本似乎很奇怪,但我很乐意务实.
假设我希望编写一个C程序(C99或C2011),我希望它是完全可移植的,而不是绑定到特定的体系结构.
似乎我想要从旧的整数类型(int,long,short)和朋友那里彻底打破,并且只使用int8_t,uint8_t,int32_t等等(也许使用最小和最快的版本).
这两个粗体的肯定是矛盾的.这是因为无论是uint32_t,uint8_t和人可用,或者其实并没有实现定义(C11,7.20.1.1/3:精确宽度整数类型).
如果您希望程序真正可移植,则必须使用内置类型(int,long等)并坚持C标准中定义的最小范围(即:C11,5.2.4.2.1:整数类型的大小))
每例如,标准说,这两个short和int范围应至少 -32767到至少 32767.所以,如果要存储一个更大或更小的值,比如42000,你会使用一个long代替.
main标准要求返回类型为intC89,C99和C11.
现在,精确宽度整数类型是整数类型的别名.因此,如果您使用正确的别名,int它仍然有效.
例如:
int32_t main(void)
Run Code Online (Sandbox Code Playgroud)
if int32_t是typedef int.