2012-04-06 8 views
2

Ich entdeckte etwas Interessantes beim Schreiben von Code. Ich habe ein Makro in meinem Code definiert und versehentlich das Schlüsselwort int als Variablenname des Parameters dieses Makros verwendet. Der Code funktionierte einwandfrei, aber ich bin ein bisschen überrascht. Ich habe gelesen, dass in C Schlüsselwörter reservierte Wörter sind und nicht als Variablennamen verwendet werden können.Kann der Name eines Makroparameters ein Schlüsselwort sein?

Dies ist mein Code:

#include <stdio.h> 

#define PRINT(int) printf("%d",int) 

int main() 
{ 
    int x=2; 
    PRINT(x); 
    return 0; 
} 

Kann mir jemand erklären, warum ist es in Ordnung zu arbeiten? Ist es nicht wahr, dass Schlüsselwörter reserviert sind und nicht als Variablennamen in C verwendet werden können, oder ist dies eine Ausnahme in C für Makros?

Antwort

6

In diesem Zusammenhang int ist keine Variable (richtiger: Parameter) Namen, weil natürlich PRINT auch keine Funktion ist - es ist ein Präprozessormakro.

Was immer Sie als Teil einer Makrodefinition schreiben, wird nur vom Präprozessor betrachtet. Zu dem Zeitpunkt, zu dem der Compiler die verarbeitete Quelle sehen kann, bleibt nichts von dem Namen "int" übrig.

Dies ist vergleichbar mit dem, was mit formalen Parametern von Funktionen passiert: Der Compiler bekommt diese Namen zu sehen, aber nachdem es mit der Quelle fertig ist, bleibt keine Spur in dem kompilierten Code (also müssen Sie Debug-Symbole laden Debugger, um "diese Information zurück zu bekommen").

+0

Es bedeutet, ich kann jedes Schlüsselwort in Makro verwenden und es wird gut funktionieren, oder? Ist dieses Ding nur für Makros in C gültig? –

+0

@dark_shadow: Der Präprozessor weiß nichts über C, soweit es das betrifft * sind * keine Schlüsselwörter (also ja, du kannst alles verwenden). Es ist in C und in C++ gültig. – Jon

+0

Danke Jon für die Klärung der Zweifel. –

2

Während der Vorverarbeitungsphasen sind Schlüsselwörter nicht vorhanden und werden nur als gewöhnliche Bezeichner betrachtet.

4

Die #define wird durch den Präprozessor ersetzt, bevor der C-Compiler es jemals sieht. Was der Compiler selbst sieht, ist dies:

Dies ist gültige C-Code. Die Verwendung eines Schlüsselworts als Variablenname führt zu folgendem Fehler:

int main() 
{ 
int float=2; 
printf("%s",float); 
return 0; 
} 

Dies wird nicht kompiliert.

1

Der C-Standardabschnitt 5.1.1.2 definiert neun Phasen der C-Translation. Vorverarbeitungsphase ist Nummer 4; Schlüsselwörter werden nur in der Phase 7 als solche erkannt; vor dieser Phase werden alle Schlüsselwörter als regulär Vorverarbeitungstoken betrachtet. Weitere Informationen finden Sie unter the standard.

keyword: one of auto break case [...]

The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as keywords, and shall not be used otherwise.

+0

Sie verknüpfen jedoch einen C++ - Standard. – cnicutar

+0

@cnicutar Sie haben Recht! Ich habe den Link korrigiert und die Abschnittsnummer aktualisiert. – dasblinkenlight

+0

Ein kleiner Zusatz, der C++ - Standard, aber nicht der C-Code, erlaubt explizit nicht, Makros mit Namen zu definieren, die mit den Schlüsselwörtern identisch sind, wenn sie Standard-Header enthalten. – AProgrammer