2010-08-17 5 views
11

Im C/C++ gibt es zwei Arten von Makro:Undef'ing eine funktionsähnliche Makro

#define ABC /* usual */ 

und

#define FUNC(a) /*function-like*/ 

Aber wie kann ich sie undefine?

Update: Es gibt also keinen Unterschied zwischen undefing "Konstante-wie Makro" und "Funktion-wie Makro"?

+1

Wenn ich '#Define abc' und '#Define abc (A)' haben, beide werden undefed mit einem '#undef abc'? – osgx

+1

Es gibt so etwas wie eine Makroüberladung. Nach dem zweiten '# define' von' abc' ist der erste weg. – Job

+0

Job, ich denke du bist wrng. Sowohl Konstanten-ähnliche als auch Makro-ähnliche Funktionen können koexistieren. Auch funktionsähnliche Makros mit unterschiedlicher Anzahl von Parametern können nebeneinander existieren. – osgx

Antwort

13
#undef ABC 
#undef FUNC 

#undef "cancels" out a previous #define. Der Effekt ist, als ob Sie nie zuvor eine #define für eine bestimmte Kennung hatten. Beachten Sie, dass #define s den Gültigkeitsbereich nicht respektieren. Daher ist es am besten, sie nur zu verwenden, wenn dies erforderlich ist.

Beachten Sie auch, dass es keine Rolle spielt, ob eine Makrokennung die "normale" Syntax verwendet, während eine andere eine "funktionsähnliche" Syntax verwendet. #define ABC und #define ABC(A) definieren beide ein Makro mit dem Namen ABC. Wenn Sie beide haben, ohne #undef einer von ihnen, der letzte "überschreibt" den anderen. (Einige Compiler eine Warnung aussenden, wenn dies geschieht.)

+2

LOL. Ich wusste, dass das passieren würde :-) – Job

12
#undef ABC 
#undef FUNC 
+2

2 Sekunden auseinander. Wenn dies ein Rennen wäre, würdest du ein Gewinner sein. ; p – wheaties

+0

Ein weiterer Fall der Schnellsten Gun im West-Problem: http://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem ;-) –

+2

Ich habe euch beide gewählt, weil * Ich kann mich nicht entscheiden *! :-) –