2012-10-28 5 views
6

Considérons la citation suivante de la norme C++ 11 (the N3376 draft, pour être précis):Littéraux de chaîne définis par l'utilisateur Vs. Autres littéraux définis par l'utilisateur

(2.14.8.5)

Si L est un utilisateur de fi ned- string-literal, soit str le littéral sans son ud-su ffi x et soit len ​​le nombre d'unités de code dans str (ie, sa longueur à l'exclusion du caractère nul final). Le L littéral est traité comme un appel de la forme

 operator "" X (str , len) 

considérant que, pour tous les autres types de littéraux définis par l'utilisateur (à virgule flottante, entier, caractère) la longueur est jamais passé le long, même si le littéral lui-même est passé comme une chaîne. Par exemple:

42_zzz; // calls operator "" _zzz("42") and not operator "" _zzz("42", 2) 

Pourquoi existe-t-il cette distinction entre les littéraux définis par l'utilisateur avec et sans chaîne? Ou devrais-je dire, pourquoi l'implémentation passe-t-elle len pour les littéraux UD? La longueur, comme dans le cas d'autres littéraux, pourrait être déduite par null-termination. Qu'est-ce que je rate?

+0

Probablement quelque chose à voir avec les encodages/jeux de caractères. Les autres paragraphes avant celui-ci ont tous "[Note: La séquence c1c2 ... ck ne peut contenir que des caractères du jeu de caractères source de base - note de fin]". – Mat

+0

@Mat: Mais les chaînes avec d'autres encodages ou jeux de caractères sont toujours à terminaison nulle, n'est-ce pas? –

+0

La terminaison nulle n'est pas suffisante. Je suppose que le "jeu de caractères source de base" n'inclut pas '\ 0'. – Mat

Répondre

8

Pour une chaîne littérale, il est raisonnablement concevable qu'un caractère nul soit incorporé dans la séquence de la chaîne, par exemple, "a\0b". Pour permettre à l'implémentation de consommer tout le littéral de chaîne, même s'il y a un caractère nul incorporé, il doit connaître la longueur du littéral. Les autres formulaires pour les littéraux définis par l'utilisateur ne peuvent pas contenir de caractères zéro incorporés.

+0

Incidemment, il est possible de définir une macro même en C99 qui, lorsqu'elle est invoquée avec un identifiant et une chaîne de caractères créera une structure constante à la compilation avec ce nom contenant la longueur de la chaîne suivie d'un tableau contenant le texte de la chaîne. null (pas sûr s'il peut compiler sous C11). Je ne sais pas si une telle chose serait possible avec le type littéral-chaîne-défini par l'utilisateur en C++, mais il semblerait utile si c'est le cas. – supercat

+0

@supercat: Je ne conteste pas que vous * pouvez * déterminer la longueur d'un littéral de chaîne. Cependant, si vous avez seulement passé un 'char const *' vous ne pouvez pas déterminer la longueur de la chaîne littérale! La manière conventionnelle de déterminer la taille en trouvant un caractère nul détermine uniquement la taille de la chaîne jusqu'au premier caractère nul. D'une certaine façon, la taille de la chaîne littérale est nécessaire (ce qui dépend de la macro que vous décrivez: elle utilise simplement sizeof (literal) -1 pour déterminer le nombre de caractères dans le littéral (à l'exclusion du '0 \) –

+0

Bien sûr, la taille de la chaîne est nécessaire, c'est pourquoi la structure que j'ai mentionnée le met avant la chaîne, mon point était que même dans une macro C on peut utiliser la longueur d'une chaîne littérale comme une constante entière. , mon code utilisait différentes macros qui génèrent des structures différentes selon que la chaîne est 0-63 octets, 0-2047 ou 0-16777215 [en utilisant un préfixe de 1, 2 ou 4 octets] .Il y a aussi des macros pour initialiser les limites- les chaînes de caractères vérifiées avec les préfixes un, deux et quatre octets Les méthodes de gestion des chaînes détectent automatiquement le type de préfixe, et peuvent également ... – supercat

6

Les chaînes sont toujours terminées en C/C++, mais cela ne signifie pas qu'elles ne peuvent pas contenir de caractère \0, vous pouvez avoir "1234\05678" et tant que cette chaîne est terminée, elle contient un '\ 0' supplémentaire.

Questions connexes