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)
written
和printed
?我希望拥有最强大和标准的代码,同时仍然只有一个do_or_die
功能.
我在这种情况下使用C99,但如果C11的答案不同,那么我也想知道这一点,以备将来使用.
Fre*_*Foo 44
C或POSIX标准无法保证,也无法保证sizeof(int) >= sizeof(ssize_t)
.通常ssize_t
大于int
,但C99中的安全和可移植选项是使用intmax_t
参数和返回值.
你唯一的保证就是wrt.之间的关系int
和ssize_t
是:
int
可以存储每个ISO C至少范围[-2 ^ 15 ... 2 ^ 15-1]的值ssize_t
可以存储每POSIX至少范围[-1 ... 2 ^ 15-1]的值(参见参考资料_POSIX_SSIZE_MAX
).(有趣的是,甚至没有保证ssize_t
可以存储其正范围的负对应物.它不是有符号的size_t
,而是具有错误值的"大小类型".)
在某种程度上使用类型:
signed
和unsigned
类型一起,ssize_t
可能是别名int
,但它不是标准C,可能是特定于环境的.
如果您的程序将在特定环境中运行,请检查是否sizeof(ssize_t) <= sizeof(int)
使用int
.否则,使用一些其他类型的T
,其中sizeof(T)
既大于大于或等于sizeof(int)
和sizeof(ssize_t)
.