Mehrere Präprozessor-Anweisungen in einer Zeile in C ++

8

Eine hypothetische Frage: Ist es möglich, ein C ++ - Programm, das Präprozessordirektiven enthält, vollständig in einer Zeile zu haben?

Eine solche Zeile würde so aussehen:

%Vor%

Was ist die Semantik einer solchen Zeile?

Gibt es außerdem Kombinationen von Direktiven, die unmöglich in einer Zeile zu erstellen sind?

Wenn dies compilerspezifisch ist, sind sowohl VC ++ - als auch GCC-Antworten willkommen.

    
dukedave 20.08.2010, 15:21
quelle

2 Antworten

11

Eine Preprocessing-Direktive muss durch einen Newline-Befehl abgeschlossen werden. Es handelt sich also um eine einzelne Preprocessing-Direktive, die ein objektartiges Makro namens foo definiert, das auf die folgende Token-Sequenz erweitert wird:

%Vor%

Jede spätere Verwendung des Namens foo in der Quelle (bis es #undef ed ist) wird auf dieses erweitert, aber nachdem das Makro erweitert wurde, werden die resultierenden Token nicht als Vorverarbeitungs-Direktive ausgewertet.

Dies ist nicht compilerspezifisch; Dieses Verhalten ist durch die C- und C ++ - Standards definiert.

    
James McNellis 20.08.2010, 15:22
quelle
6

Präprozessordirektiven unterscheiden sich etwas von Sprachanweisungen, die mit ; abgeschlossen werden und Leerzeichen zum Abgrenzen von Tokens verwenden. Im Falle des Präprozessors wird die Direktive durch eine neue Zeile beendet, so dass es unmöglich ist, das zu tun, was Sie versuchen, die C ++ - Sprache selbst zu verwenden.

Eine Möglichkeit, dies zu simulieren, ist, die gewünschten Zeilen in eine separate Header-Datei zu schreiben und dann #include , wo Sie wollen. Der separate Header muss immer noch Anweisungen in einer Zeile haben, aber der Punkt, an dem Sie ihn einfügen, ist nur eine einzelne Zeile, die genau das tut, was Sie gefragt haben.

Eine andere Möglichkeit, um so etwas zu erreichen, ist eine Pre-C ++ - Datei, die Sie vor der Kompilierung mit Ihrem C ++ - Compiler mit einem externen Prozess in eine C ++ - Quelldatei verarbeiten. Das ist wahrscheinlich mehr Ärger als es wert ist.

    
Mark B 20.08.2010 15:36
quelle

Tags und Links