web-dev-qa-db-fra.com

devrait utiliser size_t ou ssize_t

À mon code, je n'utilise pas int ou unsigned int. Je n'utilise que size_t ou ssize_t pour portable. Par exemple:

typedef size_t intc;    // (instead of unsigned int)
typedef ssize_t uintc;  // (instead of int)

Parce que strlen, string, vector... utilisent tous size_t, donc j’utilise habituellement size_t. Et je n'utilise que ssize_t quand cela peut être négatif.

Mais je trouve que:

Les types entiers non signés sont parfaits pour les utilisations qui traitent le stockage en tant que matrice de bits. Utiliser un unsigned au lieu d'un int pour gagner un bit supplémentaire pour représenter des entiers positifs n'est presque jamais une bonne idée. Les tentatives visant à s'assurer que certaines valeurs sont positives en déclarant des variables non signées seront généralement rejetées par les règles de conversion implicites.

dans le livre Le langage de programmation C++ .

Donc je suis perplexe. Ai-je tort? Pourquoi le TSL ne respecte-t-il pas la suggestion figurant dans le livre?

74
hgyxbll

ssize_t est utilisé pour les fonctions dont la valeur de retour peut être une taille valide ou une valeur négative pour indiquer une erreur. Il est garanti de pouvoir stocker des valeurs au moins dans la plage [-1, SSIZE_MAX] (SSIZE_MAX dépend du système).

Donc, vous devriez utiliser size_t chaque fois que vous voulez renvoyer une taille en octets, et ssize_t à chaque fois que vous souhaitez renvoyer une taille en octets ou une valeur d'erreur (négative).

Voir: http://pubs.opengroup.org/onlinepubs/007908775/xsh/systypes.h.html

123
maditya

ssize_t n'est pas inclus dans la norme et n'est pas portable. size_t devrait être utilisé pour gérer la taille des objets (il y a ptrdiff_t aussi, pour les différences de pointeur).

27
user657267