4

假设我希望编写一个 C 程序(C99 或 C2011),我希望它是完全可移植的,并且不依赖于特定的体系结构。

看来我想彻底摆脱旧的整数类型 ( int, long, short) 和朋友, int8_t使用,uint8_tint32_t(也许也使用leastandfast版本)。

那么返回类型是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

2 回答 2

9

假设我希望编写一个 C 程序(C99 或 C2011),我希望它是完全可移植的,并且不依赖于特定的体系结构。

看来我想彻底摆脱旧的整数类型(int、long、short)和朋友,只使用 int8_t、uint8_t、int32_t 等(也许也使用最少和最快的版本)。

这两个用粗体表示的肯定是矛盾的。这是因为uint32_t,uint8_t和 al 是否可用实际上是实现定义的(C11, 7.20.1.1/3: Exact-width integer types)。

如果您希望您的程序真正可移植,则必须使用内置类型(intlong等)并坚持 C 标准中定义的最小范围(即:C11、5.2.4.2.1:整数类型的大小),

例如,标准规定两者short和的int范围至少应为-32767 到至少32767。因此,如果您想存储更大或更小的值,例如 42000,则可以使用 along代替。

于 2013-02-12T15:24:49.480 回答
6

的返回类型main标准要求intC89、C99 和 C11。

现在精确宽度整数类型是整数类型的别名。因此,如果您使用正确的别名int它仍然有效。

例如:

int32_t main(void)

ifint32_t是一个 typedef 到int.

于 2013-02-12T14:49:06.857 回答