Vorprozessor-Parsing in C ++

8

Wenn wir Benutzereingaben verwenden möchten, um etwas in einem Programm zu tun, oder ein Ergebnis drucken wollen, müssen wir

%Vor%

Andernfalls werden cout und cin vom Compiler nicht bestätigt. Der Befehl #include ist jedoch ein Pre-Prozessor-Befehl. Und als ich mein Programm schrieb, passierte folgendes. Ich habe den folgenden Code geschrieben:

%Vor%

Und es sind keine Fehler aufgetaucht. Wie ist es möglich, cout vor dem Einfügen von iostream zu verwenden? Selbst wenn ich PRINT_DEBUG_INFO(a) ohne iostream deklariere, bekomme ich keinen Kompilierfehler.
Kann mir jemand erklären, warum das passiert?

    
Mario Zelic 28.01.2017, 15:03
quelle

4 Antworten

-2

Wenn Sie nur diese zwei Zeilen ausgeführt haben, gibt es keinen Grund für einen Fehler, weil Sie nur PRINT_DEBUG_INFO (a) definiert haben, nicht in einer Hauptfunktion implementiert. Die definierte Konstante wird nur ausgeführt, wenn sie in der Hauptfunktion implementiert ist. Betrachten Sie es als eine leere Blaupause für ein Gebäude; Obwohl es fehlerhaft ist, werden Bauingenieure es nicht auf Fehler prüfen, bis sie bereit sind, mit dem Bau des Gebäudes zu beginnen. Ähnliche Fälle hier.

Nehmen wir jedoch an, dass Sie es in der Hauptfunktion implementiert haben, genau wie ich es unten als Beispiel getan habe:

%Vor%

In diesem Fall existiert die Hauptfunktion, in der wir die Funktion PRINT_DEBUG_INFO (a) implementiert haben, nachdem wir die iostream-Datei eingefügt haben. Daher wird das Programm kompiliert und erfolgreich ausgeführt.

Denken Sie nochmals daran, dass #define nur dazu dient, ein Programm zu definieren; der Compiler wird keinen Fehler erzeugen, wenn die definierte Konstante nicht einmal einmal implementiert wird; unabhängig von den Fehlern darin (beachten Sie, dass Syntaxfehler einen Kompilierungsfehler verursachen). Es wird nur vollständig auf Fehler überprüft, wenn die Funktion wie oben implementiert ist.

Viel Glück.

    
A Busy Programmer 28.01.2017, 15:40
quelle
25

Der Präprozessor benötigt keine C ++ deklarierten Symbole, die für seine Arbeit ausgewertet werden.

Es ist reine Textverarbeitung , also definiere ein Makro wie

%Vor%

und erweitern es wie

%Vor%

wird

%Vor%

Es wird also bei der Definition oder Erweiterung des Makros nichts über die richtige C ++ - Syntax überprüft.

Diese Anweisungen werden vom C ++ - Compiler weiterbearbeitet, der darüber klagt, dass cout nicht im globalen Gültigkeitsbereich deklariert ist.

Um dies zu beheben, deklarieren Sie Ihr Makro wie

%Vor%     
πάντα ῥεῖ 28.01.2017 15:24
quelle
3

Sie definieren PRINT_DEBUG_INFO, aber Sie verwenden es nicht, so dass der Compiler nichts kompilieren oder sich darüber beschweren kann.

    
Ian Miller 28.01.2017 15:11
quelle
2

Sie definieren nur PRINT_DEBUG_INFO(a) und verwenden es nicht. Wenn Sie es tatsächlich in Ihrem Programm verwenden, erhalten Sie den Fehler, dass cout nicht definiert ist.

Wenn Sie es nicht verwenden, findet der Compiler keinen Platz, um die definierte Konstante zu ersetzen. Wenn Sie es tatsächlich verwenden, wird das Programm während der Kompilierung erweitert und zeigt Ihnen den Fehler.

Und außerdem gibt es eine Klammer in Ihrem Makro, die mit Klammern erweitert wird und zu einem Fehler führen kann.

    
Anthony Vinay 28.01.2017 15:27
quelle

Tags und Links