Warum Präprozessor #if-Anweisungen anstelle von if () sonst?

8

Ich sehe das zum Beispiel im Linux Kernel ständig. Was ist der Zweck der Verwendung der Präprozessor-Befehle vs nur normal C ++, wenn sonst blockieren? Gibt es einen Geschwindigkeitsvorteil oder etwas?

    
imkendal 06.04.2014, 18:13
quelle

3 Antworten

33

Ein Präprozessor ändert den C / C ++ - Code bevor er kompiliert wird (daher pre Prozessor).

Präprozessor ifs werden bei Kompilierzeit ausgewertet.

C / C ++ ifs werden bei Laufzeit ausgewertet.

Sie können Dinge tun, die zur Laufzeit nicht möglich sind.

Passen Sie den Code für verschiedene Plattformen oder verschiedene Compiler an:

%Vor%

Stellen Sie sicher, dass Header-Dateidefinitionen nur einmal enthalten sind (äquivalent zu #pragma once , aber portabler):

%Vor%

Sie können Dinge schneller machen als zur Laufzeit.

%Vor%

Nun, wenn das Kompilieren mit DEBUG nicht definiert ist (wahrscheinlich ein Befehlszeilenparameter für Ihren Compiler), können alle Aufrufe von some_debug_function vom Compiler weg optimiert werden.

    
Paul Draper 06.04.2014, 18:16
quelle
8

Der Präprozessor wird vor dem Kompilierungsdurchlauf ausgeführt, sodass der Compiler nicht einmal etwas sehen kann, das sich in der nicht ausgeführten #if-Verzweigung befindet.

%Vor%

gcc -c -DDEBUG = 1 file.c sieht "int a"

gcc -c file.c sieht "double b"

    
berkus 06.04.2014 18:17
quelle
3

Preprocessor ermöglicht es Ihnen, in Ihre Quelldatei, den zu kompilierenden Code, auszuschneiden oder einzufügen. Wenn es ausgeschnitten ist, ist es weg, es ist wie ein Kommentar, tut nichts, wird nicht kompiliert, produziert keinen Code in der Binärdatei. Entwickler verwenden diese Technik häufig, um Code nur im Debug-Build für Debugging-Zwecke oder zum Hinzufügen oder Ausschließen von Code für bestimmte Betriebssysteme hinzuzufügen.

    
Chris 06.04.2014 18:33
quelle