Wenn es als C ++ - Programm kompiliert wird, meldet G ++
xxx.cpp: In der Funktion int main ():
xxx.cpp: 3: Fehler: Initialisierungszeichenfolge für Array von Zeichen ist zu lang
Beim Übersetzen eines C-Programms meldet GCC keinen Fehler.
Es scheint mir, dass die Zuweisung alle 4 Bytes korrekt in die Variable kopiert, wie ich es erwartet habe.
Also meine Frage läuft auf .....
hinausIst das beobachtete Verhalten in C korrekt oder berühre ich ein undefiniertes Verhalten irgendwo, oder ist es etwas ganz anderes?
Kurze Antwort: Ihr Code ist gültig C, aber nicht gültig C ++.
Lange Antwort:
"four"
ist eigentlich 5 Zeichen lang - da ist ein
für dich hinzugefügt. Im Abschnitt 6.7.8 Initialisierung , Absatz 13, heißt es im C-Standard: ’%code%’
Ein Array von Zeichentypen kann durch ein Zeichenkettenliteral initialisiert werden, das optional in geschweifte Klammern eingeschlossen ist. Aufeinander folgende Zeichen des Zeichenkettenliterals (einschließlich des abschließenden Nullzeichens, wenn Platz vorhanden ist oder das Array eine unbekannte Größe hat) initialisieren die Elemente des Arrays.
Also wird das %code% in Ihrem Programm einfach ignoriert, wenn es als C kompiliert wird. C ++ behandelt es anders. Dieser spezielle Fall wird in der C ++ - Spezifikation (Abschnitt 8.5.2 Zeichenarrays , Absatz 2) explizit explizit genannt:
Es dürfen nicht mehr Initialisierer vorhanden sein als Array-Elemente. [ Beispiel:
%Vor%ist schlecht formatiert, da für das implizite nachgestellte %code% kein Platz ist. - Ende Beispiel ]
Die Zeichenfolge "vier" enthält tatsächlich fünf Bytes: die vier Buchstaben plus ein Nullbyte (\ 0) als Zeichenfolgenabschlusszeichen. Es ist eine Weile her, seit ich C oder C ++ geschrieben habe, aber ich würde annehmen, dass der C-Compiler es aus irgendeinem Grund still ignoriert.
Was Sie sehen, ist ein Unterschied zwischen C und C ++. C ermöglicht Ihnen zusätzliche Initializer, die ignoriert werden. C ++ verbietet dies - wenn Sie eine Größe für eine Zeichenkette (oder ein Array) angeben, muss groß genug sein, um alle Initialisierer (einschließlich des NUL-Terminators im Fall einer Zeichenkette) aufzunehmen, oder Code ist schlecht gebildet (Standard für "es ist nicht erlaubt - erwarten, dass der Compiler es ablehnt").
Tags und Links c arrays c++ initialization string-literals