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
writteneprinted?
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:
-
intpuede almacenar valores de al menos el rango [-2 ^ 15 ... 2 ^ 15-1] según ISO C -
ssize_tpuede 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
signedyunsignedjuntos 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) .