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
etprinted
?
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.
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.)
Utiliser les types d'une manière:
- Vous ne mélangez pas les types
signed
etunsigned
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 T
Où sizeof(T)
est supérieur ou égal à les deux sizeof(int)
et sizeof(ssize_t)
.