fichier d’en-tête indésirable WinGDI.h

Je fais des macros comme

#define report_msg(type,msg_str).......my_special_##type(......) #define report_error(msg_str) report_msg(ERROR,msg_str) 

Cela fonctionne parfaitement sous Linux. Quand je comstack avec Visual Studio 2010 Express, je vois que cela donne une erreur qui

 error C3861: 'my_special_0': identifier not found 

La raison en est que “ERREUR” est interprété comme 0. Et lorsque j’utilise “Aller à la définition” dans MSVC, cela passe à WinGDI.h

 /* Region Flags */ #define ERROR 0 

La question est pourquoi ce WinGDI.h est inclus? Comment puis-je l’éliminer sans toucher le code?

C’est pourquoi les macros sont diaboliques. J’ai vu des cas où TRUE et FALSE sont définis avec des valeurs différentes dans des en-têtes différents. Dans tout projet de taille décente, il peut être fastidieux de suivre les chaînes d’en-têtes. Essayer

 #undef ERROR #define report_msg(type,msg_str).......my_special_##type(......) #define report_error(msg_str) report_msg(ERROR,msg_str) 

et espérons que la “vraie” définition d’ERREUR ne sera plus nécessaire après ces déclarations.

Solution 1: les échanges incluent les commandes de certains en-têtes -> tâche fastidieuse

Solution 2: Mettez NOGDI dans le pré-processeur. Dans Visual Studio: Propriétés du projet -> Propriétés de configuration -> C / C ++ -> Préprocesseur -> Définitions du préprocesseur -> append NOGDI .

Explication: Paul m’a orienté dans la bonne direction. Je n’utilise pas d’en-têtes précompilés, je n’inclue donc pas stdafx.h . Mon problème est lié aux bibliothèques Linux vs. Windows.

Dans mon cas, j’utilise une bibliothèque, qui définit la constante ‘ERREUR’ pour les messages de journalisation. ctime.h est inclus, il utilise Windows.h / WinGDI.h .

WinGDI.h est probablement inclus via Windows.h partir de votre stdafx.h . Pour savoir où il est inclus, cochez l’option “Afficher les inclus”: Paramètres du projet-> Propriétés de configuration-> C / C ++ -> Avancé-> Afficher les inclus-> Oui et recomstackr votre source.