Using ssize_t vs int
I've got a function which I can write in one of four possible ways:
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);
And then it will be called with both of these ways for library functions:
written = do_or_die(write(...)); // POSIX write returns ssize_t printed = do_or_die(printf(...)); // printf returns int
- Which prototype should I use?
- What types should I give to
I want to have the most robust and standard code, while still having just one
I am using C99 in this case, but if answer is different for C11, then I'd like to know that too, for future.
There's no guarantee in the POSIX standard that
sizeof(int) >= sizeof(ssize_t), nor the other way around. Typically
ssize_t is larger than
int, but the safe and portable option in C99 is to use
intmax_t instead for the argument and the return value.
The only guarantees you have wrt. the relationship between
intcan store values of at least the range [-2^15 ... 2^15-1] per ISO C
ssize_tcan store values of at least the range [-1 ... 2^15-1] per POSIX (see
(Interestingly, there isn't even a guarantee that
ssize_t can store the negative counterparts of its positive range. It's not a signed
size_t, but a "size type" with an error value.)