Utilisation de ssize T vs int

Code

J'ai une fonction que je peux écrire dans un de la quatre voies possibles:

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);   

Et puis il sera appelé avec les deux de ces façons pour les fonctions de bibliothèque:

written = do_or_die(write(...)); // POSIX write returns ssize_t
printed = do_or_die(printf(...)); // printf returns int

Questions

  • quel prototype dois-je utiliser?
  • Quels types devrais-je donner à written et printed?

Je veux avoir le code le plus robuste et le plus standard, tout en n'ayant qu'une seule fonction do_or_die.

J'utilise C99 dans ce cas, mais si la réponse est différente pour C11, alors j'aimerais savoir aussi, pour le futur.

26
demandé sur alk 2013-10-07 16:14:38

2 réponses

Il n'y a aucune garantie dans les normes C ou POSIX que sizeof(int) >= sizeof(ssize_t), ni l'inverse. Typiquement {[1] } est plus grand que int, mais l'option safe and portable en C99 est d'utiliser intmax_t à la place pour l'argument et la valeur de retour.

Les seules garanties que vous avez wrt. la relation entre les int et ssize_t sont:

  • {[2] } peut stocker des valeurs d'au moins la plage [-2 ^ 15 ... 2^15-1] selon ISO C
  • ssize_t peut stocker des valeurs d'au moins l'intervalle [-1 ... 2^15-1] par POSIX (voir _POSIX_SSIZE_MAX).

(fait intéressant, il n'y a même pas de garantie que ssize_t peut stocker les homologues négatifs de sa gamme positive. Ce n'est pas un size_t signé, mais un "type de taille" avec une valeur d'erreur.)

35
répondu Fred Foo 2013-10-07 12:34:51

Utiliser les types d'une manière:

  • Vous ne mélangez pas les types signed et unsigned ensemble et
  • Vous ne tronquez pas les valeurs de types plus grands tout en les stockant dans des types plus petits (overflow/underflow)

ssize_t peut - être un alias pour int, mais il n'est pas standard C et peut être spécifique à l'environnement.

Si votre programme s'exécute dans un environnement spécifique, vérifiez si sizeof(ssize_t) <= sizeof(int) et utilisez int. Sinon, utilisez un autre type Tsizeof(T) est supérieur ou égal à les deux sizeof(int) et sizeof(ssize_t).

5
répondu LihO 2013-10-07 12:30:50