【发布时间】:2013-10-14 00:22:28
【问题描述】:
代码
我有一个函数,我可以用 一种 四种可能的方式编写它:
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);
然后它会被两种库函数调用:
written = do_or_die(write(...)); // POSIX write returns ssize_t
printed = do_or_die(printf(...)); // printf returns int
问题
- 我应该使用哪个原型?
- 我应该给
written和printed提供什么类型?
我希望拥有最强大和最标准的代码,同时仍然只有一个 do_or_die 函数。
在这种情况下我使用的是 C99,但如果 C11 的答案不同,那么我也想知道这一点,以备将来使用。
【问题讨论】:
-
由于
ssize_t可能比int更宽,您可能应该使用第四个原型。 -
@PaulR 是否有保证,或者
int也可能比ssize_t更宽? -
@delnan:我不认为这是可能的,尽管他们可能是平等的。
-
@PaulR 好吧,我可以想象一个 int 更宽的体系结构:分段内存是 16 位 x86(所以 ssize_t 是 16 位),具有 32 位整数。问题实际上是相关标准(某些版本的 C,在本例中为 POSIX)是否能保证任何事情。
-
感谢大家的洞察!我认为在实际代码中我会执行
int do_or_die(intmax_t retval);,如果它不适合则直接退出,因为由于系统的某些物理限制,不适合int的返回值纯粹是理论上的。
标签: c type-conversion standards