Beim Verketten benachbarter String-Literale

17

C und C ++ kompilieren benachbarte String-Literale als einzelnes String-Literal. Zum Beispiel das:

"Some text..." "and more text"

ist äquivalent zu:

"Some text...and more text"

In anderen Sprachen der C-Familie wie C # oder Java ist dies ein Syntaxfehler (der übrigens vollkommen in Ordnung ist).

Was ist der Grund / historische Grund dafür, dass C und C ++ dies tun?

sampathsris
quelle

Antworten:

24

Die ursprüngliche C-Sprache wurde in den Jahren 1969-1972 entworfen, als das Rechnen noch von der Lochkarte mit 80 Spalten dominiert wurde. Die Designer verwendeten 80-Säulen-Geräte wie den ASR-33 Teletype. Diese Geräte haben den Text nicht automatisch umgebrochen, sodass es einen echten Anreiz gab, den Quellcode in 80 Spalten zu belassen. Fortran und Cobol hatten explizite Fortsetzungsmechanismen, um dies zu tun, bevor sie schließlich zum freien Format übergingen.

Für Dennis Ritchie (ich nehme an) war es ein brillanter Schlag, zu realisieren, dass die Grammatik nicht mehrdeutig ist und dass lange ASCII-Zeichenfolgen in 80 Spalten eingefügt werden können, indem der Compiler einfach dazu gebracht wird, benachbarte Literalzeichenfolgen zu verketten. Unzählige C-Programmierer waren für dieses kleine Feature dankbar.

Warum wird das Feature, sobald es aktiviert ist, jemals entfernt? Es macht keinen Kummer und ist häufig praktisch. Ich für einen Wunsch mehr Sprachen hatte es. Der moderne Trend besteht darin, Zeichenfolgen mit dreifachen Anführungszeichen oder anderen Symbolen zu erweitern, aber die Einfachheit dieser Funktion in C wurde nie übertroffen.

david.pfx
quelle
8
Ein weiterer Grund ist, dass es die Verkettung von Präprozessor-Makros ermöglicht, die als String-Literale definiert sind, z. B. #define FOO "foo-value"gefolgt von"FOO's value is " FOO "."
Blrfl
3
@Blrfl: Nur so. Es ist wichtig zu wissen, dass die Verkettung von Zeichenfolgen nach Abschluss der Makrosubstitution erfolgt.
david.pfx
7

C hat keinen bestimmten String-Verkettungsoperator ( +) wie C # und Java. In C # oder Java, wenn der Compiler sieht

"a" + "b"

es kann den Code genau so kompilieren, als ob

"ab"

wurden im Quellcode geschrieben. In C gibt es jedoch keine ähnlich einfache Syntax zur Beschreibung der Verkettung von Zeichenfolgen, die der Compiler erkennen und vorberechnen kann. Also haben sich die Designer von C vor Jahrzehnten dafür entschieden

"a" "b"

würde genau das Gleiche bedeuten wie

"ab"

Natürlich hat C ++ die gleiche Konvention geerbt. Während der Standard C ++ Bibliothek Überlastungen +auf , std::stringum Mittel String - Verkettung, wird der Compiler nicht zu coalesce versuchen , "a" + "b"denn das ist tatsächlich ein Fehler ist (man kann nicht zwei hinzufügen const char *Zeiger zusammen).

Greg Hewgill
quelle
1
C hat auch keinen bestimmten Zeichenfolgentyp, sondern Zeiger auf Zeichen im Speicher. Sie können keine Zeiger hinzufügen, und selbst wenn dies +in irgendeiner Weise eine Verkettung bedeutet, müssen Sie das Problem lösen, wo sich die verkettete Zeichenfolge im Speicher befindet.
Blrfl