2 votes

Préprocesseur C comment traiter le macro de fonction comme une chaîne

Je suis en train d'utiliser mingw pour compiler du code C++ sur OSX pour Windows. Le code C++ est généré automatiquement et inclut du code spécifique à MS Visual Studio :

class __declspec(novtable) SomeClass

Lorsque je compile, j'obtiens beaucoup d'avertissements :

avertissement : directive d'attribut 'novtable' ignorée [-Wattributes]

Je veux supprimer ces avertissements. Mingw ne supporte pas l'option -Wno-microsoft, donc j'ai pensé que je pourrais faire en sorte que __declspec(notable) soit traité comme un identificateur pointant vers une chaîne vide et faire en sorte que le pré-processeur le supprime.

c'est-à-dire

#define __declspec(novtable) 

Cependant, cela est traité comme une redéfinition de la macro __declspec(), ce qui n'est pas le comportement souhaité.

Y a-t-il un moyen de faire en sorte que le pré-processeur traite __declspec(novtable) comme un identificateur, ou de supprimer autrement cet avertissement ? (Le code auto-généré problématique ne peut pas être modifié).

2voto

n.m. Points 30344

Apparemment, le compilateur a cette définition en vigueur

#define __declspec(x) __attribute__((x))

et reconnaît également certains (mais pas tous) attributs spécifiques à Microsoft comme dllexport et dllimport. Ce qui suit n'a de sens que si l'hypothèse ci-dessus est vraie.

Vous pouvez utiliser

 #undef __declspec // pour supprimer un message sur la redéfinition de macro
 #define __declspec(x) // rien

(peut-être convenablement #ifdef pour ne pas rompre la compatibilité avec MSVC).

Cela supprimera toute la fonctionnalité de __declspec, pas seulement de __declspec(novtable). Si ce n'est pas ce dont vous avez besoin, continuez de lire.

Si vous avez seulement besoin de supprimer __declspec(novtable) et de laisser tous les autres attributs intacts, essayez ceci

#define novtable // rien

La directive __attribute__ peut contenir une liste éventuellement vide d'attributs, donc __declspec(novtable) se traduira probablement par __attribute__(()), ce qui est parfaitement correct. Cela tuera également toutes les autres occurrences de l'identificateur novtable. Si celui-ci apparaît dans un autre contexte, ce qui n'est pas très probable mais possible, cette option ne fonctionnera pas pour vous.

Une autre possibilité est de reprendre toute la fonctionnalité.

#undef __declspec
#define __declspec(x) mon_attribut_ # x

#define mon_attribut_dllexport __attribute__((dllexport)) // ou ce dont vous avez besoin
#define mon_attribut_dllimport __attribute__((dllimport)) // ou ce dont vous avez besoin
// ... même pour tous les attributs dont vous avez besoin

#define mon_attribut_novtable // rien
// ... même pour tous les attributs dont vous n'avez pas besoin

2voto

Nikita Points 11

Définissez votre __declspec(novtable) avec un certain macro:

 #define DECL_SPEC __declspec(novtable)  

Après cela, vous pouvez l'utiliser comme suit:

 class DECL_SPEC SomeClass 

Et redéfinir DECL_SPEC comme vide si nécessaire:

 #ifdef __MINGW32__
 #define DECL_SPEC
 #else
 #define DECL_SPEC __declspec(novtable)
 #endif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X