2015-11-06 9 views
5

Ich denke an so etwas wie dieses:Sind Kommentare in derselben Zeile wie Präprozessordirektiven erlaubt und was bedeutet sie in diesem Fall?

#include <iostream> // Comment 

Nun, cppreference.com (http://en.cppreference.com/w/cpp/preprocessor) behauptet, dass:

Die Vorverarbeitung Richtlinien das Verhalten des Prä-Prozessor steuern. Jede Richtlinie nimmt eine Zeile und hat das folgende Format:

Zeichen # Vorverarbeitung Anweisung (einer von definieren, undef, umfassen, wenn ifdef, ifndef, else, elif, endif, Linie, Fehler, pragma) Argumente (ist abhängig von der Anweisung) Zeilenumbruch

So gut, ist eine vollständige Spezifikation für die gesamte Linie gegeben, und es gibt keinen Platz für einen dort Kommentar. Vorschläge für Kommentare sind in solchen Zeilen nicht zulässig.

Allerdings akzeptieren sowohl g ++ als auch clang ++ solche Eingaben auch mit -Wall -Wextra -Wpedantic. Auch bietet cplusplus.com Beispiele für solche Kommentare: http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

Ich bin noch mehr verwirrt durch die Tatsache, dass jemand mir gesagt, dass „Es ist immer noch gültig Kommentare in # Linien zu setzen, aber sie könnten nicht bedeuten, was Sie wollen“ . Ich bin nicht sicher, wie das der Fall sein könnte, da nach http://en.cppreference.com/w/cpp/language/translation_phases Kommentare durch Leerzeichen ersetzt werden, bevor der Präprozessor gestartet wird - also, wenn sie auf # Zeilen erlaubt sind, wie konnten sie die Semantik einer solchen # Zeile stören?

Antwort

9

Wie in den Übersetzungsphasen angegeben dokumentieren Sie verknüpfen: Kommentare werden mit einem Raum in Schritt 3 von Phase ersetzt 3. Der Präprozessor in Phase ausgeführt wird 4.

Also von der Zeit der Präprozessor # Linien verarbeitet, Kommentare wurden in Whitespaces umgewandelt, die im Allgemeinen keinen Einfluss auf das Verhalten der Preprocessing-Direktiven haben.