2008-11-14 6 views
6

Wie kann ich dem Präprozessor mitteilen, dass er ein bestimmtes Makro nicht ersetzen soll?Verhindern, dass C-Präprozessor eine bestimmte Makrosubstitution ausführt

Das spezifische Problem ist das folgende: Windows-Headerdateien definieren das GetMessage-Makro.

Meine C++ Header-Dateien mit meiner API haben eine GetMessage-Methode. Ich möchte meine Methode nicht umbenennen. Aber wenn Sie die API unter Windows verwenden, ersetzt windows.h den GetMessage-Methodenaufruf durch GetMessageA.

+0

Das Ausführen von #undef GetMessage ist nicht gut, da der Code, der die API verwendet, auch Windows GetMessage verwendet. –

+0

Ah, ein weiteres Beispiel für die wahllose Verwendung von Makros durch Windows SDK, die alle Namespaces (und nicht nur die Namespace-Funktion von C++) überlisten. –

+0

@vincent: siehe don.newfelds Kommentar in ShoeLaces '#undef GetMessage' Antwort –

Antwort

6

haben Sie versucht gerade einen direkt

#undef GetMessage

oder sogar

#ifdef GetMessage 
#undef GetMessage 
#endif

und dann ruft die Fenster GetMessageA oder GetMessageW tun, je nachdem, was angemessen ist.

Sie wissen sollten, wenn Sie char * verwenden für wchar_t8 ..

(dank don.neufeld)

Brian sagt auch, dass Jus einige nützliche Informationen, können Sie auch die Pragma push_macro verwenden können/pop_macro zum Schieben und Aufrufen von Makrodefinitionen. Das ist großartig, wenn Sie eine Makrodefinition in einem Codeblock überschrieben werden sollen:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

Ich vermute, dies ist ein MS Spezifikum obwohl, so sollte man nicht vergessen.

+0

Aber dann kann ich die Windows GetMessage nicht mehr verwenden –

+0

Ja, du kannst einfach GetMessageA oder GetMessageW direkt aufrufen, je nachdem, was angebracht ist. –

+0

Und ja, push_macro und pop_macro sind MS-spezifisch. Pragmas sind per definitionem implementierungsdefiniert und ich habe diese außerhalb von MS-Code nicht bemerkt. Natürlich ist dies möglicherweise kein Problem für jemanden, der sich für die Windows-API programmiert. –

1

Gibt es Code, der sowohl Ihre GetMessage als auch Window's GetMessage aufruft?

Dieser Code kann nicht zwischen den beiden unterscheiden. Sie können nicht beide in derselben Datei aufrufen.

Wenn Sie eine Funktion in einer Datei und die andere in einer anderen Datei verwenden, tun Sie einfach die vorgeschlagene #undef in einer Datei.

0

Ihre Einschränkungen, wie sie in Ihrem Kommentar umrissen, der einzige Weg, dies zu tun ist zu tun:

#undef GetMessage 

direkt vor dem Aufruf von GetMessage Ihre API. (Und dies setzt voraus, niemand nach dieser Punkt in der Quelldatei wird die Win32 GetMessage aufrufen.)

+0

Das ist nicht die einzige Möglichkeit, aber es würde erfordern, dass Sie windows.h nicht einschließen. :) –

6

(GetMessage)(...)

GetMessage on MSDN

+0

Während dies oft ein guter Weg wäre, um unbeabsichtigt durch ein Makro verblüfft zu werden, glaube ich nicht, dass es für GetMessage funktioniert, da es nicht als ein "funktionsähnliches" Makro definiert ist. –

+1

Oh, richtig ... das funktioniert nur, wenn die Funktion vor dem Makro deklariert ist, nicht danach (was ich glaube sowieso nicht garantiert). MSN – MSN

4

Jus einige nützliche Informationen, können Sie auch die Verwendung von Pragma push_macro/pop_macro schieben und Pop-Makrodefinitionen. Das ist großartig, wenn Sie eine Makrodefinition in einem Codeblock überschrieben werden sollen:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

Ich vermute, dies ist ein MS Spezifikum obwohl, so sollte man nicht vergessen.

+0

MS spezifisch sollte kein Problem sein, da das Problem in einem Makro ist, das durch windows.h definiert ist: P –

+0

Es ist ein Problem, weil es non-MS Compiler-Suiten gibt, die Windows (zum Beispiel mingw) zielen. – CesarB

Verwandte Themen