使用ssize_t vs int

时间:2013-10-07 12:14:39

标签: c type-conversion posix standards systypes.h

代码

我有一个函数可以用一个写出四种可能的方法:

int do_or_die(int retval);
int do_or_die(ssize_t retval);
ssize_t do_or_die(int t retval);   
ssize_t do_or_die(ssize_t retval);   

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

written = do_or_die(write(...)); // POSIX write returns ssize_t
printed = do_or_die(printf(...)); // printf returns int

问题

  • 我应该使用哪种原型?
  • 我应该向writtenprinted提供哪些类型?

我希望拥有最强大和标准的代码,同时仍然只有一个do_or_die函数。

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

3 个答案:

答案 0 :(得分:42)

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

唯一保证你有技术。 intssize_t之间的关系是:

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

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

答案 1 :(得分:5)

以某种方式使用类型:

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

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

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

答案 2 :(得分:0)

您可以使用int或long int数据类型,但是ssize_t是应用于跨平台可移植性的系统数据类型。在不同的实现上,基本类型(例如'int')的大小可以不同。通常,系统类型(在这种情况下为ssize_t)会利用C的typedef功能,从而使用特定于机器的数据类型大小,例如typedef signed ssize_t(这是SUSv3标准数据类型的一部分)。在实施任何类型的系统级编程时,请尽可能使用系统数据类型。

有关更详细的描述,请参阅Linux编程接口(Michael Kerrisk)