使用ssize_t vs int

hyd*_*yde 30 c standards type-conversion

我有一个函数,我可以用以下四种方式之一编写:

    int do_or_die(int retval);
    int do_or_die(ssize_t retval);
    ssize_t do_or_die(int retval);   
    ssize_t do_or_die(ssize_t retval);   
Run Code Online (Sandbox Code Playgroud)

然后,它将使用这两种方式调用库函数:

    written = do_or_die(write(...)); // POSIX write returns ssize_t
    printed = do_or_die(printf(...)); // printf returns int
Run Code Online (Sandbox Code Playgroud)

问题

  • 我应该使用哪种原型?
  • 我应该给什么类型writtenprinted

我希望拥有最强大和标准的代码,同时仍然只有一个do_or_die功能.

我在这种情况下使用C99,但如果C11的答案不同,那么我也想知道这一点,以备将来使用.

Fre*_*Foo 44

C或POSIX标准无法保证,也无法保证sizeof(int) >= sizeof(ssize_t).通常ssize_t大于int,但C99中的安全和可移植选项是使用intmax_t参数和返回值.

你唯一的保证就是wrt.之间的关系intssize_t是:

  • int 可以存储每个ISO C至少范围[-2 ^ 15 ... 2 ^ 15-1]的值
  • ssize_t可以存储每POSIX至少范围[-1 ... 2 ^ 15-1]的值(参见参考资料_POSIX_SSIZE_MAX).

(有趣的是,甚至没有保证ssize_t可以存储其正范围的负对应物.它不是有符号的size_t,而是具有错误值的"大小类型".)

  • `ssize_t`实际上在C标准中根本没有指定.它是POSIX标准的一部分. (37认同)
  • ssize_t 的链接只提到了最大大小,仅此而已,甚至没有提到符号。你能提供一个参考吗?谢谢。 (2认同)

Lih*_*ihO 5

在某种程度上使用类型:

  • 您不混合signedunsigned类型一起,
  • 您不要将较大类型的值截断为较小类型(溢出/下溢)

ssize_t可能是别名int,但它不是标准C,可能是特定于环境的.

如果您的程序将在特定环境中运行,请检查是否sizeof(ssize_t) <= sizeof(int)使用int.否则,使用一些其他类型的T,其中sizeof(T)既大于大于或等于sizeof(int)sizeof(ssize_t).

  • `ssize_t`不是x86-64系统上`int`的别名. (4认同)