c type-conversion posix standards systypes.h

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 e printed ?

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 y unsigned 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) .