【问题标题】:Integer types in CC中的整数类型
【发布时间】:2013-02-12 14:48:07
【问题描述】:

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

看来我想彻底摆脱旧的整数类型(intlongshort)和朋友,只使用int8_t、@ 987654325@、int32_t 等(可能也使用leastfast 版本)。

那么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 的大小吗?对于大量使用,[例如短循环],整数的大小完全无关紧要。您只是在代码中增加了复杂性,并可能通过强制编译器使用不一定是理想类型的类型来使代码变慢。这在某些地方可能确实有帮助,但在大多数地方,它可能并不那么重要。

标签: c int c99 c11


【解决方案1】:

假设我想编写一个 我想成为的 C 程序(C99 或 C2011) 完全可移植,不依赖于特定架构。

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

这两个用粗体表示的肯定是矛盾的。这是因为 uint32_tuint8_t 和 al 是否可用实际上是实现定义的(C11,7.20.1.1/3:精确宽度整数类型)。

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

例如,标准规定shortint 的范围应从至少 -32767 到至少 32767。因此,如果您想存储更大或更小的值,例如 42000,您可以使用 long

【讨论】:

    【解决方案2】:

    在 C89、C99 和 C11 中,标准要求 main 的返回类型为 int

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

    例如:

    int32_t main(void)
    

    如果int32_tint 的类型定义。

    【讨论】:

    猜你喜欢
    • 2015-06-27
    • 2010-11-27
    • 2015-05-26
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多