Est-il obligatoire d’échapper aux caractères tabulateurs en C et C ++?

Dans C et C ++ (et plusieurs autres langages), les tabulasortingces horizontales (code ASCII 9) dans les constantes de caractères et de chaînes sont notées sous la forme échappée sous la forme '\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 une tabulation dans Bêta A et B ), et au moins clang ++ ne semble pas déranger – la chaîne semble être équivalente à "A\tB" . J’aime mieux la version sans échappée, car les chaînes multi-lignes en retrait sont mieux lisibles dans le code source.

Maintenant, je me demande si cela est généralement légal en C et C ++ ou juste 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 trouvé de réponse à cette question apparemment simple, ni avec Google ni avec stackoverflow (je viens de trouver cette question vaguement liée).

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

tout membre du jeu de caractères source à l’exception du guillemet double, de la barre oblique inverse \ ou du caractère de nouvelle ligne

(d’après la norme C ++ 11 , annexe A.2)

et le jeu de caractères source comprend:

le caractère d’espacement, les caractères de contrôle représentant les tabs horizontaux , verticaux, les formulaires et les nouvelles lignes, plus les 91 caractères graphiques suivants

(du standard C ++ 11 , paragraphe 2.3.1)

MISE À JOUR: 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 essentiellement 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 les membres correspondants du jeu de caractères source ou […]

où les jeux de caractères source et exécution incluent

les caractères de contrôle représentant les tabs horizontaux , verticaux et les formulaires.

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

Donc c’est portable. Mais ce n’est pas une bonne idée, car il est impossible pour un lecteur de distinguer différents types d’espaces blancs. Il est également très courant que les éditeurs de texte, les programmes de messagerie, etc., puissent reformater les tabs afin que des bogues puissent être introduits dans le programme au cours de ces opérations.

Si vous entrez un onglet dans une entrée, votre chaîne contiendra un caractère tabulaire littéral, qui restra un caractère de tabulation – il ne sera pas traduit magiquement en \t interne.

Même chose pour l’écriture de code – vous pouvez incorporer des caractères de tabulation littéraux dans vos chaînes. Cependant, considérez ceci:

  TTT <--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 combien de caractères y figurent, il n'y a pratiquement aucun moyen de déterminer s'il y a un onglet ou des espaces réels. Mais avec la version \t , il s’agit immédiatement d’un onglet.

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