2008-11-14 3 views
6

Comment puis-je dire au préprocesseur de ne pas remplacer une macro spécifique?Empêcher le préprocesseur C d'effectuer une macro de substitution spécifique

Le problème spécifique est le suivant: Les fichiers d'en-tête Windows définissent la macro GetMessage.

Mes fichiers d'en-tête C++ avec mon API ont une méthode GetMessage. Je ne veux pas renommer ma méthode. Mais lors de l'utilisation de l'API sous Windows, y compris windows.h remplace mon appel de méthode GetMessage par GetMessageA.

+0

L'exécution de #undef GetMessage n'est pas bonne, car le code qui utilise l'API utilise également Windows GetMessage. –

+0

Ah, un autre exemple de l'utilisation indiscriminée des macros de Windows par le SDK clabaudant tous les espaces de noms (et pas seulement dans la fonctionnalité d'espace de noms de C++). –

+0

@vincent: voir don.Le commentaire de newfeld dans la réponse '#undef GetMessage' de ShoeLace –

Répondre

6

avez-vous essayé de faire juste un

#undef GetMessage

ou même

#ifdef GetMessage 
#undef GetMessage 
#endif

puis appeler les fenêtres GetMessageA ou GetMessageW directement, selon le cas.

vous devez savoir si vous utilisez char * pour wchar_t8 ..

(don.neufeld merci)

Brian dit aussi que certains __gVirt_NP_NN_NNPS<__ informations Jus utiles, vous pouvez également utiliser le #pragma push_macro/pop_macro pour pousser et afficher les définitions de macros. Ceci est très bien si vous voulez remplacer une définition de macro dans un bloc de code:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

Je soupçonne que c'est une caractéristique spécifique MS cependant, gardez cela à l'esprit.

+0

Mais alors je ne peux plus utiliser le GetMessage de Windows –

+0

Oui, vous pouvez simplement appeler GetMessageA ou GetMessageW directement, selon ce qui est approprié. –

+0

Et, oui, push_macro et pop_macro sont spécifiques à MS. Les pragmas sont définis par l'implémentation par définition, et je n'ai pas remarqué ces codes MS en dehors. Bien sûr, cela peut ne pas être un problème pour quelqu'un qui code pour l'API Windows. –

1

Existe-t-il du code qui appelle GetMessage et GetMessage de Windows?

Un tel code ne pourra pas faire la différence entre les deux. Vous ne serez pas en mesure d'appeler les deux dans le même fichier.

Si vous utilisez une fonction dans un fichier et l'autre dans un autre fichier, faites simplement le #undef suggéré dans un fichier.

0

Compte tenu de vos contraintes, comme indiqué dans votre commentaire, la seule façon que vous pouvez faire est de faire:

#undef GetMessage 

juste avant l'appel à GetMessage de votre API. (Et cela suppose Noone après ce point dans le fichier source appelle Win32 GetMessage.)

+0

Ce n'est pas le seul moyen, mais cela vous obligerait à ne pas inclure windows.h. :) –

6

(GetMessage)(...)

GetMessage on MSDN

+0

Bien que ce soit souvent un bon moyen d'éviter d'être malmené par une macro, je ne pense pas que cela fonctionnera pour GetMessage, car il n'est pas défini comme une macro «fonctionnelle». –

+1

Oh, c'est vrai ... cela ne fonctionne que si la fonction est déclarée avant la macro, pas après (ce qui ne me semble pas garanti de toute façon). MSN – MSN

4

Jus certains __gVirt_NP_NN_NNPS<__ informations utiles, vous pouvez également utiliser le #pragma push_macro/pop_macro pour pousser et pop définitions de macros. Ceci est très bien si vous voulez remplacer une définition de macro dans un bloc de code:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

Je soupçonne que c'est une caractéristique spécifique MS cependant, gardez cela à l'esprit.

+0

MS spécifique ne devrait pas être un problème car le problème est dans une macro définie par windows.h :-P –

+0

C'est un problème car il existe des suites de compilateurs non MS ciblant Windows (par exemple, mingw). – CesarB

Questions connexes