C 使用ssize\u t vs int 代码

C 使用ssize\u t vs int 代码,c,type-conversion,standards,C,Type Conversion,Standards,我有一个函数,我可以用四种可能的方法之一编写: int do_或_die(int retval); int do_或_die(ssize_t retval); 使用不使用或不使用(内部检索); 死亡或死亡(再次死亡); 然后将通过以下两种方式调用库函数: writed=do_或_die(write(…);//POSIX写入返回ssize\t printed=do_或_die(printf(…);//printf返回int 问题 我应该使用哪个原型 我应该为书面的和印刷的提供哪些类型 我

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

int do_或_die(int retval);
int do_或_die(ssize_t retval);
使用不使用或不使用(内部检索);
死亡或死亡(再次死亡);

然后将通过以下两种方式调用库函数:

writed=do_或_die(write(…);//POSIX写入返回ssize\t
printed=do_或_die(printf(…);//printf返回int
问题
  • 我应该使用哪个原型
  • 我应该为
    书面的
    印刷的
    提供哪些类型
我希望拥有最健壮、最标准的代码,同时仍然只有一个
do\u或\u die
函数


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

POSIX标准中不能保证
sizeof(int)>=sizeof(ssize_t)
。通常
ssize\u t
大于
int
,但C99中的安全和可移植选项是将
intmax\u t
用于参数和返回值

唯一的保证是你有wrt。
int
ssize\u t
之间的关系是:

  • int
    可以按照ISO C存储至少在[-2^15…2^15-1]范围内的值
  • ssize\u t
    可以存储每个POSIX至少在[-1…2^15-1]范围内的值(请参阅)
(有趣的是,甚至不能保证
ssize\u t
可以存储其正范围的负对应项。它不是有符号的
size\u t
,而是带有错误值的“size type”。

以某种方式使用类型:

  • 您不能将
    有符号的
    无符号的
    类型混合在一起,并且
  • 在将较大类型的值存储在较小类型(溢出/下溢)中时,不会截断较大类型的值
ssize\u t
可能是
int
的别名,但它不是标准C,可能是特定于环境的


如果您的程序将在特定环境中运行,请检查
sizeof(ssize_t)是否可以使用int或long int数据类型,但是
ssize_t
是一种应用于跨平台移植的系统数据类型。基本类型(如“int”)在不同的实现中可以是不同的大小。通常情况下,系统类型(在本例中为
ssize\u t
)利用C的typedef功能,以便使用机器特定的数据类型大小,例如
typedef签名的ssize\u t
(这是SUSv3标准数据类型的一部分)。在执行任何类型的系统级编程时,如果可能,最好使用系统数据类型


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

,因为
ssize\t
可能比
int
更宽,您可能应该使用第四个原型。@PaulR可以保证,或者
int
也可能比
ssize\t
更宽?@delnan:我认为这不可能,尽管它们可能是相等的。@PaulR好吧,我可以想象一个int更宽的体系结构:分段内存是一个16位x86(所以ssize_t是16位),带有32位整数。问题是相关标准(C的某些版本,在本例中是POSIX)是否能保证任何东西。感谢大家的关注!我认为在真正的代码中,我将执行
int do_或_die(intmax_t retval)并干净地退出,因为由于系统的某些物理限制,
int
中不适合的返回值纯粹是理论值。
ssize\t
实际上在C标准中根本没有规定。这是POSIX标准的一部分。ssize\u的链接只提到了最大大小,没有更多,甚至没有提到签名。你能提供一个参考吗?谢谢。我刚刚发现
int\u fast64\t
存在于C++11中。我很想用它作为我的默认整数类型“最快的带符号整数类型,宽度分别至少为8、16、32和64位”,就像@2501所说的,请您发布更多关于最小值的参考,因为您发布的参考没有说明最小值。
ssize\u t
不是x86-64系统上
int
的别名。@larsmans:我已将其改写为“可能是
int
的别名”:)出于实际原因,
ssize\u t
将至少与指针大小相同,或者对最大写入大小有不合理的限制。但是我想没有人能保证指针的大小>=int的大小,或者确实存在?@hyde:通常,
ssize\t
size\t
的有符号对应物,但是POSIX甚至不能保证。@larsmans是的,我想可以为32位操作系统提供一个参数,使其具有
size\t
32位,但
ssize\t
更宽,为了避免只写/读地址空间的一半。。。