Die Sequenz Backslash-Newline wird in einer sehr frühen Phase (Phase 2) des Übersetzungsprozesses aus dem Code entfernt. Früher haben Sie lange String-Literale erstellt, bevor eine String-Verkettung stattfand, und Sie erweitern Makros immer noch über mehrere Zeilen.
Siehe §5.1.1.2 Translation Phasen des C99-Standard:
Der Vorrang unter den Syntaxregeln der Übersetzung durch die folgenden Phasen angegeben wird. 5)
- Physikalische Quelldatei Mehrbyte-Zeichen abgebildet sind, in einer Implementierung definiert Weise mit dem Source-Zeichensatz (new-line Zeichen für end-of-line-Indikatoren) erforderlichenfalls einzuführen. Trigraph-Sequenzen werden durch entsprechende interne Ein-Zeichen-Repräsentationen ersetzt.
- Jede Instanz eines Backslash-Zeichens (
\
), unmittelbar gefolgt von einem neuen Zeichen , wird gelöscht, wobei physische Quellzeilen zu logischen Quellzeilen verbunden werden. Nur der letzte Backslash auf einer physischen Quellleitung darf als Teil eines solchen Spleißes verwendet werden. Eine Quelldatei, die nicht leer ist, muss in einem neuen Zeilenzeichen enden, , dem nicht unbedingt ein Backslash-Zeichen vorangestellt werden muss, bevor ein solches -Spleißen stattfindet.
- Die Quelldatei wird in Vorverarbeitungstoken zerlegt 6) und Sequenzen von Leerzeichen (einschließlich Kommentare). Eine Quelldatei darf nicht in einem teilweisen Vorverarbeitungstoken oder in einem Teilkommentar enden. Jeder Kommentar wird durch ein Leerzeichen ersetzt. Zeichen für neue Zeilen bleiben erhalten. Ob jede nicht leere Folge von Leerzeichenklassen außer Newline beibehalten oder durch ersetzt wird, ist ein Leerzeichen definiert.
- Vorverarbeitungsdirektiven werden ausgeführt, Makroaufrufe werden erweitert und
_Pragma
unäre Operatorausdrücke werden ausgeführt. Wenn eine Zeichenfolge, die die Syntax eines universellen Charakternamens entspricht, von Token Verkettung (6.10.3.3) erzeugt wird, ist das Verhalten nicht definiert.Eine #include
Vorverarbeitung Direktive bewirkt, dass der benannte Header oder die Quelldatei rekursiv von Phase 1 bis Phase 4 verarbeitet wird. Alle Vorverarbeitungsdirektiven werden dann gelöscht.
- Jeder Quellzeichensatzmember und die Escape-Sequenz in Zeichenkonstanten und String-Literalen wird in das entsprechende Element des Ausführungszeichens konvertiert set; Wenn es kein entsprechendes Mitglied gibt, wird es in eine Implementierung konvertiert, die als Element definiert ist, das nicht das Nullzeichen (Wide) ist. 7)
- Benachbarte String-Literaltoken werden verkettet.
- Leerzeichen, die Token trennen, sind nicht länger von Bedeutung. Jedes Vorverarbeitungstoken wird in ein Token konvertiert. Die resultierenden Token werden syntaktisch und semantisch analysiert und als Übersetzungseinheit übersetzt.
- Alle externen Objekt- und Funktionsreferenzen sind aufgelöst. Bibliothekskomponenten sind verknüpft, um externe Referenzen auf Funktionen und Objekte zu erfüllen, die nicht in der aktuellen -Übersetzung definiert sind. Alle derartigen Übersetzerausgaben werden in einem Programmbild gesammelt, das Informationen enthält, die zur Ausführung in seiner Ausführungsumgebung benötigt werden.
5) Implementationen werden als verhalten, wenn diese getrennten Phasen auftreten, obwohl der Regel zusammengefaltet in der Praxis viele sind.
6) Wie in 6.4 beschrieben, ist der Prozess zum Teilen der Zeichen einer Quelldatei in Vorverarbeitungstoken kontextabhängig. Siehe zum Beispiel die Behandlung von <
innerhalb einer #include
Vorverarbeitungsrichtlinie.
7) Eine Implementierung muss nicht alle nicht entsprechenden Quellzeichen in die gleiche Ausführung Zeichen konvertieren.
Wenn Sie nach Ihrem streunenden Backslash ein Leerzeichen oder ein anderes Zeichen hatten, hätten Sie einen Kompilierungsfehler. Wir können feststellen, dass Sie nichts danach haben, weil Sie keinen Kompilierungsfehler haben.
Der andere Teil Ihrer Frage, etwa:
"\n";
ist ganz anders. Es ist ein einfacher Ausdruck, der keine Nebenwirkungen hat und daher keine Auswirkungen auf das Programm hat. Der Optimierer wird es komplett verwerfen. Wenn Sie schreiben:
i = 1;
Sie haben einen Ausdruck mit einem Wert, der verworfen wird; es wird für seinen Nebeneffekt des Modifizierens i
ausgewertet.
Manchmal werden Sie Code finden wie:
*ptr++;
Der Compiler wird Sie warnen, dass das Ergebnis des Ausdrucks verworfen wird; der Ausdruck kann vereinfacht werden zu:
ptr++;
und wird den gleichen Effekt im Programm erreichen.
"\ n"; es ist eine Aussage ohne Wirkung. Es wird vom Compiler komplett ignoriert und generiert eine Warnung. Versuchen Sie, mit dem gcc -Wall-Flag zu kompilieren, das Kompilierungswarnungen aktiviert. – dAm2K
Ihre Hauptfrage wurde mehrmals beantwortet. In Bezug auf den Teil über '" \ n ";' ist ein c-Programm (mehr oder weniger) eine Liste von Anweisungen. Ein Literalwert (wie '3' oder' "\ n" 'oder' 'hamburger'') ist eine absolut gültige Aussage, auch wenn es nichts tut. – jpm