51 votes

Littéral multicaractère C ++

Je ne savais pas que le C et le C++ autoriser multicharacter literal: pas de " c "(de type int en C et char en C++), mais "tralivali' (de type int!)

enum
{
    ActionLeft = 'left',
    ActionRight = 'right',
    ActionForward = 'forward',
    ActionBackward = 'backward'
};

La norme dit:

C99 6.4.4.4p10: "La valeur d'un entier constante de caractère contenant plus d'un personnage (par exemple, "ab"), ou contenant un caractère ou d'échapper à des la séquence ne correspond pas à une un seul octet d'exécution de caractère, est la mise en œuvre définies."

J'ai découvert qu'ils sont largement utilisés dans le moteur C4. Mais je suppose qu'ils ne sont pas sûrs quand on parle de la plate-forme independend de sérialisation. Thay peut être source de confusion aussi parce que comme les cordes. Donc, qu'est-ce que multicaractère littérale de la portée de l'utilisation, sont-ils utiles pour quelque chose? Sont-ils en C++, il suffit pour la compatibilité avec du code C? Sont-ils considérés comme une mauvaise fonctionnalité goto opérateur ou pas?

30voto

Ferruccio Points 51508

Cela facilite la sélection des valeurs dans un vidage de la mémoire.

Exemple:

 enum state { waiting, running, stopped };
 

contre.

 enum state { waiting = 'wait', running = 'run.', stopped = 'stop' };
 

un vidage de mémoire après la déclaration suivante:

 s = stopped;
 

pourrait ressembler à:

 00 00 00 02 . . . .
 

dans le premier cas, vs:

 73 74 6F 70 s t o p
 

en utilisant des littéraux multicaractères. (Bien sûr, le fait de dire "stop" ou "pots" dépend de l'ordre des octets)

22voto

Nick Points 5293

Je ne sais pas à quel point il est utilisé, mais "la mise en œuvre définies" est un grand drapeau rouge pour moi. Autant que je sache, cela pourrait signifier que la mise en œuvre pourrait choisir d'ignorer votre personnage désignations et seulement affecter normal de l'incrémentation des valeurs si elle le voulait. Il peut faire quelque chose de "plus agréable", mais vous ne pouvez pas compter sur ce comportement à travers les compilateurs (ou même des versions de compilateur). Au moins "goto" est prévisible (si indésirable) le comportement...

C'est mon 2c, de toute façon.

Edit: sur "la mise en œuvre définies":

De Bjarne Stroustrup du C++ Glossaire:

la mise en œuvre définies - un aspect de la C++de la sémantique qui est défini pour chaque mise en œuvre plutôt que de spécifiées dans la norme pour tous les la mise en œuvre. Un exemple est la taille d'un int (qui doit être d'au moins 16 bits, mais peut être plus long). Éviter la mise en œuvre, les comportements définis chaque fois que possible. Voir aussi: undefined. TC++PL C. 2.

aussi...

undefined - un aspect de C++ la sémantique pour laquelle aucune raisonnable comportement est nécessaire. Un exemple est un déréférencement d'un pointeur avec la valeur zéro. Éviter un comportement indéfini. Voir aussi: la mise en œuvre définies. TC++PL C. 2.

Je crois que cela signifie que le commentaire est correct: il faut au moins de la compilation, bien que rien au-delà qui n'est pas spécifié. Remarque les conseils dans la définition, aussi.

5voto

jv42 Points 6392

Quatre chaînes de caractères, j'ai vu et utilisé. Ils correspondent à 4 octets = un 32 bits word. Il est très utile à des fins de débogage comme dit ci-dessus. Ils peuvent être utilisés dans un switch/case instruction par les services de renseignements, ce qui est agréable.

Ce (4 Caractères) est assez standard (c'est à dire pris en charge par la GCC et VC++ au moins), bien que les résultats (valeurs réelles compilé) peut varier d'une implémentation à une autre.

Mais plus de 4 caractères? Je ne voudrais pas l'utiliser.

Mise à JOUR: à Partir de la C4 page: "Pour nos actions simples, nous allons fournir une énumération de certaines valeurs, ce qui est fait en C4 en spécifiant quatre constantes de caractère". Ils sont donc à l'aide de 4 caractères littéraux, comme ce fut mon cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X