2013-08-07 13 views
5

habe gerade herausgefunden, dass alle folgenden Arbeiten:Mischen breite und schmale Stringliterale in C

printf("%ls\n", "123" L"456"); 
printf("%ls\n", L"123" "456"); 
printf("%ls\n", L"123" L"456"); 

Der Ausgang ist

123456 
123456 
123456 

Warum kann ich frei breite und schmale Stringliterale mische und um ein breites String-Literal als Ergebnis zu bekommen? Ist das ein dokumentiertes Verhalten?

Antwort

8

Ist das ein dokumentiertes Verhalten?

Ja, dieses Verhalten von der Norm, aus dem Abschnitt 6.4.5Stringliterale paragrph der C99 draft standard sagt (Hervorhebung von mir) unterstützt wird:

In Translation Phase 6, die Multibyte-Zeichenfolgen, die durch irgendeine Sequenz von benachbarten Zeichen- und breiten String-Literaltoken spezifiziert sind, werden zu einer einzelnen Multibyte-Zeichensequenz verkettet. Wenn eines der Tokens Zeichenfolgenliteralzeichen ist, wird die resultierende Multibyte-Zeichenfolge als Wide-String-Literal behandelt; Andernfalls wird es als Zeichenfolgenliteral behandelt.

5

6.4.5 Stringliterale

In Übersetzungsphase 6 angegebene Mehrbyte-Zeichensequenzen durch beliebige Sequenz benachbarter Zeichen und breit Stringliteral Token werden in einer einzigen Mehrbyte-Zeichenfolge verkettet . Wenn eines der Tokens Zeichenfolgenliteralzeichen groß ist, wird die resultierende Multibytezeichenfolge als Wide-String-Literal behandelt. Andernfalls wird als Zeichenfolgenliteral behandelt.