2009-01-23 7 views
14

Dans MSVC je cela dans un en-tête:avertissements utilisateur sur msvc ET gcc?

#define STR(x)   #x 
#define STR2(x)   STR(x) 
#define NOTE(text)  message (__FILE__ "(" STR2(__LINE__) ") : -NOTE- " #text) 
#define noteMacro(text) message (__FILE__ "(" STR2(__LINE__) ") : " STR2(text)) 

et je

#pragma NOTE(my warning here) 

GCC a:

#warning(my warning here) 

Cependant MSVC (2003) jette un ajustement quand il voit #warning et donne "erreur fatale C1021: commande de préprocesseur invalide" avertissement ""

Que puis-je faire à ce sujet? Existe-t-il un moyen pour GCC de reconnaître les avertissements MSVC ou MSVC ne pas jeter une erreur sur les avertissements GCC? Y at-il quelque chose que je peux faire qui fonctionne sur les deux? Je peux demander au GCC de me prévenir des pragmas inconnus, mais ce n'est pas la solution la plus idéale.

+0

#ifdef ne le ferait-il pas? – Loki

+0

J'ai fusionné '#ifdef _MSC_VER/GCC ...' en un seul 'PRAGMA_WARNING', http://stackoverflow.com/a/40147989/621706 – fantastory

Répondre

15

La meilleure solution que j'ai trouvé à ce problème est d'avoir les éléments suivants dans un en-tête commune:

// compiler_warning.h 
#define STRINGISE_IMPL(x) #x 
#define STRINGISE(x) STRINGISE_IMPL(x) 

// Use: #pragma message WARN("My message") 
#if _MSC_VER 
# define FILE_LINE_LINK __FILE__ "(" STRINGISE(__LINE__) ") : " 
# define WARN(exp) (FILE_LINE_LINK "WARNING: " exp) 
#else//__GNUC__ - may need other defines for different compilers 
# define WARN(exp) ("WARNING: " exp) 
#endif 

Ensuite, utilisez

#pragma message WARN("your warning message here") 

à travers le code au lieu de #WARNING

Sous MSVC, vous obtiendrez un message comme celui-ci:

c:\programming\some_file.cpp(3) : WARNING: your warning message here 

Sous gcc vous obtiendrez:

c:\programming\some_file.cpp:25: note: #pragma message: WARNING: your warning message here 

Pas parfait, mais un compromis raisonnable.

+1

Markdown ne semble pas vouloir travailler pour moi, mais je voulais ajouter que si vous ne supportez que les versions de GCC compatibles avec C99 et VS2008 +, vous pouvez utiliser le mot-clé __Pragma de GCC (ex: '__Pragma (message (" WARNING : "exp))') et le mot-clé __pragma de MSVC (ex: '__pragma (message (FILE_LINE_LINK" WARNING: "exp))') pour raccourcir un peu plus loin. Je suppose que VS2008 est la version minimale prise en charge, car c'est la [première version sur MSDN] (http://msdn.microsoft.com/en-us/library/d9x1s805 (v = vs.90) .aspx) qui a une documentation référençant ce mot-clé. –

+0

Si vous imprimez "warning:" au lieu de "WARNING:" au début du message (après FILE_LINE_LINK) il apparaît même dans la liste des erreurs comme un avertissement! – Gombat

6

Comme vous l'avez maintenant découvert, #warning n'est pas une fonctionnalité standard, donc vous ne pouvez pas l'utiliser avec des compilateurs qui ne le supportent pas. Si vous voulez que votre code fonctionne sur plusieurs plates-formes, vous n'utiliserez pas du tout #warning - ou, du moins, pas le code que MSVC est censé traiter (il peut être prétraité par #ifdef ou équivalent). Par conséquent:

#ifdef __GNUC__ 
#warning(warning message) 
#else 
#pragma NOTE(warning message) 
#endif 

Mais qui répète le message et je suis sûr que vous aviez à l'esprit de ne pas le faire - et il est encombrant; vous ne l'utiliseriez que très rarement. Vous pourriez aussi avoir besoin de traiter avec d'autres compilateurs que GCC (et je ne suis pas assez familier avec MSVC pour savoir comment l'identifier de façon fiable).

Ce serait bien si #warning étaient standardisés; il n'est pas standardisé en C99.

(Il y avait, autrefois depuis longtemps, une question SO sur ces caractéristiques qui pourraient être ajoutées à C et #warning est venu là-bas.)

Voir aussi: Portability of #warning preprocessor directive

3

garde les aveC# si des déclarations. Recherchez un symbole défini par un compilateur mais pas l'autre.

#ifdef _MSC_VER 
#pragma NOTE(my warning here) 
#else 
#warning(my warning here) 
#endif 

Un peu moche, mais je ne vois pas d'autre moyen.

+0

Vous avez ajouté ceci alors que je n'étais pas en train d'éditer ma réponse et d'ajouter le test inverse. .. Je suppose que _MSC_VER est la contrepartie de __GNUC__! Merci. –

+0

_MSC_VER non seulement vous déclare être dans Microsoft C++, il définit également la version que vous utilisez. –

1

Si vous le souhaitez, vous pouvez ajouter aux solutions ci-dessus une petite chose (#pragma warning) avant votre #pragma message:

#pragma warning() 
#pragma message(" SOME USER WARNING - FILE LINE etc... ") 

Ce petit complément génère réel avertissement, et ne semble pas mal dans la fenêtre de VC. Par exemple:

1>e:\proj\file.h(19) : warning C4615: #pragma warning : unknown user warning type 
1> SOME USER WARNING - FILE LINE etc... 
1>proj - 0 error(s), 1 warning(s) 

Habituellement j'utiliser cette méthode pour les avertissements étaient pas trop calme, comme dans le cas de code sans #pragma warning(). Par exemple, la forme des avertissements est trop calme (pour moi bien sûr).

1> SOME USER WARNING - FILE LINE etc.. 
1>proj - 0 error(s), 0 warning(s) 

Cependant, seulement un petit cosmétique.

+0

Une façon plus simple de forcer le compilateur MSVC à compter/afficher un avertissement réel est d'avoir le texte ** ": warning:" ** dans le message de sortie. – Matthew

Questions connexes