c - Usando ssize_t vs int
type-conversion posix (2)
Código
Tengo una función que puedo escribir de una de las cuatro formas posibles:
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);
Y luego se llamará con estas dos formas para funciones de biblioteca:
written = do_or_die(write(...)); // POSIX write returns ssize_t
printed = do_or_die(printf(...)); // printf returns int
Preguntas
- ¿Qué prototipo debo usar?
- ¿Qué tipos debo dar por
written
eprinted
?
Quiero tener el código más robusto y estándar, mientras sigo teniendo solo una función do_or_die
.
Estoy usando C99 en este caso, pero si la respuesta es diferente para C11, también me gustaría saberlo para el futuro.
No hay garantía en los estándares C o POSIX de que sizeof(int) >= sizeof(ssize_t)
, ni lo contrario. Normalmente, ssize_t
es más grande que int
, pero la opción segura y portátil en C99 es usar intmax_t
para el argumento y el valor de retorno.
Las únicas garantías que tienes de wrt. La relación entre int
y ssize_t
es:
-
int
puede almacenar valores de al menos el rango [-2 ^ 15 ... 2 ^ 15-1] según ISO C -
ssize_t
puede almacenar valores de al menos el rango [-1 ... 2 ^ 15-1] por POSIX (consulte_POSIX_SSIZE_MAX
).
(Curiosamente, ni siquiera existe una garantía de que ssize_t
pueda almacenar las contrapartes negativas de su rango positivo. No es un tamaño firmado, sino un "tipo de tamaño" con un valor de error).
Usar tipos de una manera:
- no se mezclan tipos
signed
yunsigned
juntos y - no trunca valores de tipos más grandes mientras los almacena en tipos más pequeños (desbordamiento / subdesbordamiento)
ssize_t
puede ser un alias para int
, pero no es C estándar y puede ser específico del entorno.
Si su programa se ejecutará en un entorno específico, verifique si sizeof(ssize_t) <= sizeof(int)
y use int
. De lo contrario, use algún otro tipo T
donde sizeof(T)
sea mayor o igual que sizeof(int)
y sizeof(ssize_t)
.