Was passiert mit der benachbarten String-Literalverkettung, wenn ein Modifikator vorhanden ist (L, u8 usw.)?

9

In C und C ++ ist es zulässig, ein Zeichenfolgenliteral aufzubrechen, weil der Präprozessor oder der Compiler dies tut Verkettung benachbarter String-Literale.

%Vor%

Was passiert, wenn Zeichenfolgenliteralen das Präfix L (breite Zeichen), u (UTF-16), U (UTF-32), u8 (UTF-8) und rohe Zeichenfolgenliterale vorangestellt wird ( R"foo(this is a "raw string literal" with double quotes)foo" )?

Zum Beispiel ist Folgendes erlaubt:

%Vor%     
Benoit 03.03.2011, 10:20
quelle

2 Antworten

12

In C ++ 0x ist Ihr Beispiel gemäß [lex.string] / p13:

gültig
  

... Wenn ein String-Literal keine hat   Codierungs-Präfix, wird es als a behandelt   String-Literal von demselben   Kodierung-Präfix als der andere Operand.   ...

In C ++ 03 hieß es in diesem Abschnitt, dass dieser Code ein undefiniertes Verhalten hatte:

  

... Wenn ein Zeichenfolgen-Literal-Token schmal ist   ist neben einem breiten String-Literal   Token, das Verhalten ist nicht definiert. ...

    
Howard Hinnant 03.03.2011, 15:41
quelle
3

Ja, dieses spezielle Beispiel wird von C ++ 0x erlaubt. Jede Kombination von labels ohne Präfix und L wird als L-Präfix behandelt.

EDIT: Citation - N3242 (aktueller C ++ 0x Arbeitsentwurf) §2.14.5 / 13:

  

In der Übersetzungsphase 6 (2.2) werden benachbarte String-Literale verkettet. Wenn beide Zeichenfolgenliterale dasselbe Codierungs-Präfix haben, hat das resultierende verkettete Zeichenfolgenliteral dieses Codierungs-Präfix. Wenn ein Zeichenfolgenliteral kein Codierungspräfix hat, wird es als Zeichenfolgenliteral desselben Codierungspräfixes wie der andere Operand behandelt.

    
ildjarn 03.03.2011 10:25
quelle

Tags und Links