2016-03-28 7 views
0

Der folgende Code:Funktionsmakros ohne Körper, sondern verschiedene Namen Argumentations

#define MYDEF(x) 
#define MYDEF(y) 
int main() {} 

gibt mir eine error (oder wenn pedantic-errors Warnung deaktiviert ist):

'MYDEF' Makro neu definiert

Der Grund ist andere Namen für unbenutztes Argument (mehr vorbei, es gibt keinen Körper im Makro). Aber warum? In welchen Situationen kann es ein Problem sein?

+2

Der Standard erfordert, dass mehrere Definitionen eines Makros identisch sind. Die beiden obigen Definitionen sind nicht identisch. Sie sind gleichwertig, aber der Standard erfordert identische. Wenn Sie mit einer anderen Definition neu definieren wollen, '# undef 'das alte Makro zuerst. –

Antwort

7

Weil Makros keine Funktionen sind. Sie sind textuelle Ersetzungen, die vom Präprozessor durchgeführt werden und nicht überladen werden können.

Es ist (fast) ähnlich, in Ihrem Editor zu finden und zu ersetzen. Finde alle Vorkommen von MYDEF und ersetze sie durch (leere Zeichenfolge in deinem Fall). Es ist natürlich komplizierter, aber die Idee ist dieselbe.

Und Sie können nicht überladen diese finden und ersetzen, können Sie? :)

0

Das Makro kann neu definiert werden, und das Makro wird eindeutig durch den Makronamen bestimmt. Zum Beispiel Code wie folgt:

#define MYDEF(x) //the name of the macro is 'MYDEF' 
#define MYDEF(x, y) //the name of the macro is 'MYDEF' too 

MYDEF(x) wird von MYDEF(x, y) neu definiert (oder bedeckt), können Sie keinen Code MYDEF(x) mehr nach

definieren MYDEF(x, y) so schreiben, wenn Sie Code schreiben:

#define MYDEF(x) 
#define MYDEF(y) //(There compiler will give warning). You can write 
        //`#undef MYDEF` before `#define MYDEF(y)` to avoid it. 

MYDEF(x) wird vonneu definiert werden.

Verwandte Themen