2017-12-22 5 views
0

Dies ist eine Übung in einem Buch. Die Frage ist, was die Ausgabe dieses Codes ist.C-Code nach Präprozessor

Dieser Code druckt immer "N ist undefined", aber ich weiß nicht warum. Der Befehl "#undef N" steht hinter der Funktion f. Warum ist die Ausgabe immer "N ist undefiniert"?

#define N 100 
void f(void); 

int main(void) 
{ 
    f(); 
    #ifdef N 
     #undef N 
    #endif 
    return 0; 
} 

void f(void) 
{ 
    #if defined(N) 
     printf("N is %d\n", N); 
    #else 
    printf("N is undefined\n"); 
    #endif 
} 

Antwort

0

Da die Anweisungen des Preprozessors in der Reihenfolge "physical" Zeile für Zeile ausgeführt werden.

Denken Sie darüber nach, etwas vor der eigentlichen Kompilierung ausgeführt wird, auf eine solche Weise ist Ihr Code klar, nur mit einfachen C-Code für den Compiler.

1

Der Zweck dieser Übung besteht darin, zu demonstrieren, dass der Kontrollfluss des Präprozessors vollständig vom Kontrollfluss Ihres Programms getrennt ist.

#if/#undef Anweisungen werden in der Reihenfolge verarbeitet, in der sie im Text Ihres Programms erscheinen. Sie werden nur einmal zur Kompilierzeit verarbeitet. Die Entscheidung, eine Präprozessorvariable zu definieren oder zu deaktivieren, kann zur Laufzeit nicht erneut überprüft werden.

Deshalb ist die Tatsache, dass f vor #if/#undef Linie des main ausführt irrelevant ist. Sie können die Ausgabe dieses Programms nur ändern, indem Sie f an eine Position in der Datei vormain verschieben.

1

Wenn Sie den Compiler mit dem -E-Flag (zumindest für gcc) ausführen, zeigt es Ihnen, was der Code ist, den Sie tatsächlich kompilieren.

Sie werden sehen, dass der Präprozessor der Ausführung des Codes nicht folgt - er führt seine Aktionen in der Reihenfolge aus, in der er in der Datei erscheint.

Dann nimmt der Compiler den resultierenden Code und f hat nur den einen Aufruf an printf drin, der sagt N ist nicht definiert.

1

Der C-Präprozessor durchläuft Ihren Code Zeile für Zeile. Daher ist es falsch anzunehmen, dass die #undef nach der Funktion f() wegen des Funktionsaufrufs passiert. Stattdessen passiert es vor Ihrer Definition der Funktion f().

Um dies zu verstehen, müssen Sie zwischen dem Präprozessor (Zeile für Zeile) und dem Kontrollfluss (folgt Funktionsaufrufe) unterscheiden.