const char * Initialisierung

8

Dies ist eine Verwendung, die ich in einer Open-Source-Software gefunden habe. Und ich verstehe nicht, wie es funktioniert. wenn ich es an die stdout ausgab, war es "Version 0.8.0".

%Vor%     
逍遥之魂 27.03.2012, 15:13
quelle

7 Antworten

7

Dies ist ein grundlegendes Merkmal von C89 und C ++ 98, das 'angrenzende Zeichenkettenverkettung' oder so genannt wird.

Wenn zwei Zeichenfolgenliterale ohne Interpunktion dazwischen liegen, werden sie zu einer einzigen Zeichenfolge zusammengefügt, wie Ihre Ausgabe zeigt.

In der C ++ 98-Norm sagt Abschnitt §2.1 'Phasen der Übersetzung [lex.phases]':

  

6 Benachbarte gewöhnliche String-Literaltoken werden verkettet. Benachbarte Wide-String-Literaltoken werden verkettet.

Dies ist, nachdem der Präprozessor abgeschlossen ist.

Im C99-Standard lautet der entsprechende Abschnitt in §5.1.2.1 "Übersetzungsphasen" und besagt:

  

6 Benachbarte String-Literaltoken werden verkettet.

Der Wortlaut wäre in jedem anderen C- oder C ++ - Standard sehr ähnlich, den Sie in die Hand nehmen können (und ich erkenne, dass sowohl C ++ 98 als auch C99 durch C ++ 11 und C11 ersetzt sind; ich habe es einfach nicht elektronische Kopien der endgültigen Normen, noch).

    
Jonathan Leffler 27.03.2012, 15:16
quelle
9

Es wird String-Verkettung genannt - wenn Sie zwei (oder mehr) in Anführungszeichen gesetzte Strings nebeneinander im Quellcode einfügen, zwischen denen nichts ist, fügt der Compiler sie in eine einzige Zeichenfolge zusammen. Dies wird meistens für lange Strings verwendet - alles mehr als eine Zeile lang:

%Vor%

Bevor die Verkettung von Strings erfunden wurde, mussten Sie dies mit einer ziemlich unbeholfenen Zeilenfortsetzung tun, indem Sie am Ende jeder Zeile einen Backslash setzen (und sicherstellen, dass es das Ende war), weil die meisten Compiler es nicht als Zeilenfortsetzung behandeln würden wenn nach dem Backslash Leerzeichen vorhanden waren). Es gab auch Hässlichkeit damit, Einrückung zu werfen, weil irgendein Leerzeichen am Anfang der folgenden Linien in der Schnur enthalten sein könnte.

Dies kann zu einem kleineren Problem führen, wenn Sie ein Komma zwischen den Zeichenfolgen einfügen möchten, z. B. wenn Sie ein Array von Zeigern auf char initialisieren. Wenn Sie ein Komma verpassen, wird Sie der Compiler nicht warnen - Sie erhalten nur eine Zeichenfolge, die zwei separate enthält.

    
Jerry Coffin 27.03.2012 15:15
quelle
6

Ein Teil der C ++ - Standardimplementierung besagt, dass String-Literale, die nebeneinander liegen, miteinander verkettet werden.

Zitate aus C und C ++ Standard:

Für C (Zitat C99, aber C11 hat etwas ähnliches in 6.4.5p5):

  

(C99, 6.4.5p5) "In der Übersetzungsphase 6 das Multibyte-Zeichen   Sequenzen, die durch eine beliebige Abfolge von benachbarten Zeichen und   Gleich vorangestellte String-Literaltoken werden zu a verkettet   einzelne Multibyte-Zeichenfolge. "

Für C ++:

  

(C ++ 11, 2.14.5p13) "In Übersetzungsphase 6 (2.2), benachbarter String   Literale werden verkettet. "

    
Hunter McMillen 27.03.2012 15:16
quelle
3
%Vor%

ist dasselbe wie:

%Vor%

Der Compiler verkettet die angrenzenden Teile von String-Literalen, wodurch ein größeres Stück String-Literal entsteht.

Als Nebenbemerkung ist const char* (was in Ihrem Titel ist) nicht dasselbe wie char char[] (was in Ihrem geposteten Code ist).

    
Nawaz 27.03.2012 15:15
quelle
2

Der Compiler verkettet automatisch hintereinander geschriebene String-Literale (nur durch Leerzeichen getrennt). Es ist so, als hätten Sie

geschrieben %Vor%

EDIT: korrigierter Pre-Prozessor zum Compiler

    
Attila 27.03.2012 15:16
quelle
2

Benachbarte Zeichenfolgenliterale sind verkettet :

  

Wenn String-Literale angegeben werden, werden benachbarte Strings verkettet.   Daher diese Erklärung:

     

char szStr []="12" "34"; ist identisch mit dieser Erklärung:

     

char szStr []="1234"; Diese Verkettung benachbarter Zeichenketten macht es   einfach lange Strings über mehrere Zeilen hinweg zu spezifizieren:

     

cout & lt; & lt; "Vier Punkte und sieben Jahre"           "Vor, unsere Vorfahren brachten hervor"           "Auf diesem Kontinent eine neue Nation.";

    
tmpearce 27.03.2012 15:16
quelle
0

Wenn Sie Strings nacheinander aneinanderreihen, werden sie zur Kompilierzeit verkettet:

%Vor%

Dies ist eine merkwürdige Verwendung der Funktion, normalerweise ist es% cos_de% strings zu verwenden:

%Vor%

Kompiliert auf dasselbe wie:

%Vor%     
Matt 27.03.2012 15:17
quelle

Tags und Links