Est-il obligatoire d'échapper les caractères tabulateurs en C et c++?

En C et c++ (et plusieurs autres langages), les tabulateurs horizontaux (code ASCII 9) dans les constantes de caractères et de chaînes sont notés sous forme échappée comme 't' et "t". Cependant, je tape régulièrement le caractère tabulateur Non échappé dans les littéraux de chaîne comme par exemple dans "A B" (Il y a un onglet dans betreen A et B), et au moins clang++ ne semble pas déranger - la chaîne semble être équivalente à "AtB". J'aime mieux la version non échappée car les chaînes multi-lignes longues en retrait sont mieux lisible dans le code source.

Maintenant, je me demande si cela est généralement légal en C et c++ ou simplement supporté par mon compilateur. Dans quelle mesure les tabulateurs Non échappés sont-ils portables dans les constantes de caractères et de chaînes?

Étonnamment, je n'ai pas pu trouver de réponse à cette question apparemment simple, ni avec Google ni sur stackoverflow (je viens de trouver cette question vaguement liée).

54
c
demandé sur Community 2015-03-06 17:26:26

4 réponses

Oui, vous pouvez inclure un caractère de tabulation dans une chaîne ou un caractère littéral, au moins selon C++11. Les caractères autorisés incluent (avec mon accent):

Tout membre du jeu de caractères source sauf le guillemet double ", la barre oblique inverse \ ou le caractère de nouvelle ligne

(de norme C++11, Annexe A. 2)

Et le jeu de caractères source comprend:

Le caractère espace, les caractères de contrôle représentant tabulation horizontale , tabulation verticale, flux de formulaire et nouvelle ligne, plus les 91 caractères graphiques suivants

(à partir de norme C++11, paragraphe 2.3.1)

UPDATE: je viens de remarquer que vous posez des questions sur deux langues différentes. Pour C99, la réponse est également oui. Le libellé est différent, mais dit fondamentalement la même chose:

Dans une constante de caractère ou un littéral de chaîne, les membres du jeu de caractères d'exécution doivent être représentés par membres correspondants du jeu de caractères source ou [...]

Où les jeux de caractères source et d'exécution incluent

Caractères de Contrôle représentant tabulation horizontale, tabulation verticale, et formez l'alimentation.

56
répondu Mike Seymour 2015-03-06 14:43:36

Il est tout à fait légal de mettre un caractère de tabulation directement dans une chaîne de caractères ou un caractère littéral. Les normes C et c++ exigent que le jeu de caractères source inclue un caractère de tabulation, et les littéraux de chaîne et de caractère peuvent contenir n'importe quel caractère du jeu de caractères source, sauf une barre oblique inverse, une citation ou une apostrophe (le cas échéant) et une nouvelle ligne.

Donc c'est portable. Mais ce n'est pas une bonne idée, car il n'y a aucun moyen qu'un lecteur puisse faire la distinction entre différents types d'espaces. Il est aussi assez commun pour les éditeurs de texte, les programmes de messagerie, et autres pour reformater les onglets, de sorte que des bogues peuvent être introduits dans le programme au cours de ces opérations.

27
répondu rici 2015-03-07 02:11:10

Si vous entrez un onglet dans une entrée, votre chaîne contiendra un caractère de tabulation littéral, et elle restera un caractère de tabulation - elle ne sera pas traduite comme par magie en \t en interne.

Il en va de même pour l'écriture de code-vous pouvez intégrer des caractères de tabulation littéraux dans vos chaînes. Cependant, considérez ceci:

     T     T     T        <--tab stops
012345012345012345012345
foo1 = 'a\tb';
foo2 = 'a  b'; // pressed tab in the editor
foo3 = 'a  b'; // hit space twice in the editor

Sauf si vous placez le curseur sur l'espace entre a et b et vérifiez le nombre de caractères, il n'y a essentiellement aucun moyen de déterminer s'il y a un onglet ou l'espace réel personnages là. Mais avec la version \t, Il est immédiatement montré comme un onglet.

9
répondu Marc B 2015-03-06 14:36:17

Lorsque vous appuyez sur la touche TAB, vous obtenez le point de code sur lequel votre système mappe cette touche. Ce point de code peut ou non être un onglet sur le système où le programme s'exécute. Lorsque vous mettez \t dans un littéral, le compilateur le remplace par le point de code approprié pour le système cible. Donc, si vous voulez être sûr que vous obtenez un onglet sur le système où le programme s'exécute, utilisez \T. C'est son travail.

2
répondu Pete Becker 2015-03-06 19:53:23