使用ssize_t vs int

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

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的答案不同,那么我也想知道这一点,以备将来使用。

在C或POSIX标准中,无法保证sizeof(int) >= sizeof(ssize_t)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 ,而是具有错误值的“大小类型”。)

在某种程度上使用类型:

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

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

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