2012-06-11 2 views
5

sich das folgende C Programm (ignorieren Sie die Doppelnebeneffekt Ausgabe):Makroerweiterung für Makros mit Argumenten gegen Variablen mit dem gleichen Namen

#define max(a, b) (a>b?a:b) 

int main(void){ 
    int max = max(5,6); 
    return max; 
} 

Der GCC Präprozessor macht daraus:

int main(void){ 
    int max = (5>6?5:6); 
    return max; 
} 

Das ist ganz nett, da Sie sich keine Gedanken über unbeabsichtigte Kollisionen zwischen max und max() machen müssen. Die GCC manual sagt:

Ein funktionsähnliches Makro wird nur erweitert, wenn sein Name mit einem Paar Klammern nach ihm erscheint. Wenn Sie nur den Namen schreiben, ist es allein

Ist dies standardisiert oder nur etwas durch Konvention gemacht?

Antwort

5

Ja, das Verhalten hier ist klar definiert.

Ihr Makro max ist ein funktionsähnliches Makro (d. H. Wenn Sie es definieren, folgt auf seinen Namen sofort eine linke Klammer und es werden Argumente verwendet). Eine Verwendung von max später in Ihrem Code ist nur ein Aufruf dieses Makros, wenn auf die Verwendung von max eine linke Klammer folgt. Also, das würde die max Makro nicht aufrufen:

int max; 
max = 42; 

Aber diese würden alle berufen sich auf die max Makro:

max(1, 2) 
max (1, 2) 
max 
(
    1, 2 
) 
max() 

(Beachten Sie, dass die letzte Zeile schlecht gebildet wird, da die Anzahl der Argumente nicht Passen Sie die Anzahl der Parameter an.Dies ist jedoch immer noch ein Makroaufruf und würde einen Kompilierungsfehler verursachen.)

Dieses Verhalten wird vom C-Sprachstandard vorgeschrieben. C99 §6.10.3/10 heißt es, dass nach einer funktionsähnlichen Makros definiert wurde,

Jede nachfolgende Instanz der funktionsähnlichen Makronamen von einem ( als nächste Vorverarbeitungseinheit Token gefolgt stellt die Sequenz von Tokens Vorverarbeitung das wird durch die Ersetzungsliste in der Definition ersetzt (ein Aufruf des Makros).

+0

Ich bin verwirrt. Es sieht so aus, als würde gcc das Max-Makro honorieren und stattdessen die echte Max-Funktion aufrufen. – octopusgrabbus

+0

@octopusgrabbus: Was 'Max' Funktion? –

+0

Gefunden den relevanten Teil in der GCC-Handbuch, aber ich weiß immer noch nicht, ob dies standardisiert oder nur eine informelle Konvention – mensi

Verwandte Themen