2009-09-14 7 views
8

Qu'est-ce que les gens utilisent pour indiquer que size_t n'est pas valide? -1 ne fonctionne pas et 0 peut être une taille valide.Valeur invalide pour size_t

+0

Comment -1 "fonctionne pas"? –

+0

Personnellement, je refuse d'utiliser des systèmes non-POSIX et je m'attends à ce que 'ssize_t' soit disponible. –

Répondre

10

Peut-être ((size_t)-1)?

à proprement parler, il est une taille valide, mais une fois que vous avez ce que vous n'êtes pas susceptible d'avoir besoin de tout autre ;-)

+1

certaines des fonctions de chaîne multi-octets C99 font ceci: elles renvoient '(size_t) (- 1)' ou même '(size_t) (- 2)' pour indiquer des conditions anormales; ce n'est pas optimal, mais cela fonctionne dans la pratique; Si la raison de votre question est la gestion des erreurs, il peut être préférable de passer un pointeur sur une variable d'erreur (par exemple un flag d'erreur de type '_Bool', un code d'erreur de type' int' ou un message d'erreur de type ' const char * ') comme argument supplémentaire – Christoph

+0

Oui, c'est un idiome commun. Vous pouvez également voir le '(time_t) -1' aussi bien. –

+0

@ MichaelKrelin-hacker: '(time_t) -1' est un peu différent; la norme dit spécifiquement que c'est la valeur renvoyée par 'time()' si l'heure actuelle ne peut pas être déterminée. Et 'time_t' est souvent un type signé, donc' (time_t) -1' est typiquement 1 seconde avant l'époque. –

3

Fondamentalement, vous ne pouvez pas. Quelle que soit la valeur que vous utilisez peut être valide. Mieux vaut passer un drapeau en disant qu'il est invalide.

1

Et que faites-vous pour indiquer qu'un int est invalide? -1 est une valeur valide pour un int. Ces types n'ont pas de valeurs "invalides" désignées. Vous pouvez décider de choisir une certaine valeur (qui ne peut normalement pas être la valeur de ce que votre variable représente) pour représenter une valeur illégale, mais c'est votre propre définition, et non quelque chose que les gens utilisent généralement.

Personnellement, je n'aime pas ça. Je préfère créer une autre variable, bool IsValid, qui dira si la valeur de cette variable size_t est valide. Parfois, il peut même être préférable de créer une classe pour les encapsuler.

4

Si vous parlez de std :: string, alors la valeur invalide de size_t est std :: string :: npos. Normalement, vous ne devriez pas utiliser -1 car size_t est non signé, et vous pouvez obtenir des comparaisons échouées sur un compilateur effectuant des conversions implicites entre types. Cela étant dit, npos de std :: strings est mis à 0XFFFFFFFFFFFFFFFF ... qui est l'équivallent binaire de -1. Il évalue également à la valeur maximale autorisée pour un champ size_t non signé.

+0

c'est 'string :: size_type', pas' size_t' ;-) –

+1

Encore ... le reste de la réponse est en or massif. OR MASSIF! – Kieveli

+0

Au moins ça brille ;-) –

0

Ma version est:

#include <limits> 
#define invalid_index std::numeric_limits<size_t>::max() 
+3

'std :: numeric_limits :: max()' ne compile pas dans 'C' car cette question est balisée. – chux

Questions connexes