【发布时间】:2013-02-12 14:48:07
【问题描述】:
假设我想编写一个 C 程序(C99 或 C2011),我希望它是完全可移植的,并且不依赖于特定的架构。
看来我想彻底摆脱旧的整数类型(int、long、short)和朋友,只使用int8_t、@ 987654325@、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 似乎很奇怪,但我很高兴能够务实。
【问题讨论】:
-
使用
int作为main()的返回类型,您认为有什么可移植性问题? -
int 是可移植的,因为它可以在任何机器上编译。现在,如果您说尝试返回 12344567891233445567,您会遇到问题,但老实说,您最后一次这样做是什么时候?您返回的所有数字都应该相当小。例如错误代码。
-
我意识到使用
int使程序在这种情况下具有可移植性,而在其他任何地方似乎可移植性都需要使用固定大小的类型。也许这只是一种必要的不对称。 -
为了可移植性,您必须假设符合标准。如果实施不合规,则所有赌注都将取消。否则,您可以在许多情况下使用
ints,而不必担心可移植性。例如,您可以假设范围为 +/- 32767。 -
您的代码的可移植性真的那么依赖
int的大小吗?对于大量使用,[例如短循环],整数的大小完全无关紧要。您只是在代码中增加了复杂性,并可能通过强制编译器使用不一定是理想类型的类型来使代码变慢。这在某些地方可能确实有帮助,但在大多数地方,它可能并不那么重要。