2009-01-23 20 views
14

In MSVC Ich habe dies in einem Header:Benutzerwarnungen auf msvc UND 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)) 

und ich

#pragma NOTE(my warning here) 

GCC hat:

#warning(my warning here) 

jedoch MSVC (2003) wirft einen Anfall, wenn es #warning sieht und gibt "fataler Fehler C1021: ungültiger Präprozessorbefehl 'Warnung'"

Was kann ich dagegen tun? Gibt es eine Möglichkeit, dass GCC MSVC-Warnungen erkennt oder MSVC keinen Fehler bei GCC-Warnungen auslöst? Gibt es etwas, was ich tun kann, das auf beiden funktioniert? Ich kann GCC vor unbekannten Pragmas warnen lassen, aber das ist nicht die ideale Lösung.

+0

Würde #ifdef es nicht tun? – Loki

+0

Ich habe fusionierte '#ifdef _MSC_VER/GCC ...' 'in einzelne PRAGMA_WARNING', http://stackoverflow.com/a/40147989/621706 – fantastory

Antwort

15

Die beste Lösung, die ich für dieses Problem gefunden haben, ist die folgende in einem gemeinsamen Header zu haben:

// 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 

Dann

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

im Code anstelle von #WARNING

Unter MSVC erhalten Sie eine Nachricht wie folgt:

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

Unter gcc Sie erhalten:

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

Nicht perfekt, aber ein vernünftiger Kompromiss.

+1

Abschriften scheint nicht für mich arbeiten zu wollen, aber ich wollte, dass hinzufügen, wenn Sie nur GCC-Versionen kompatibel mit C99 unterstützen und VS2008 +, Sie __Pragma Keyword GCC verwenden können (zB: '__Pragma (Meldung (" WARNING : "exp))') und __pragma Keywords MSVC (ex: '__pragma (Meldung (FILE_LINE_LINK "WARNUNG:" exp))') weiterhin ein bisschen dies bis zu verkürzen. Ich gehe davon aus, dass VS2008 die minimale Version unterstützt wird, so dass die [erste Version auf MSDN] ist (http://msdn.microsoft.com/en-us/library/d9x1s805 (v = VS.90) aspx), dass Enthält eine Dokumentation, die auf dieses Schlüsselwort verweist. –

+0

Wenn Sie am Anfang der Nachricht (nach FILE_LINE_LINK) "warning:" anstelle von "WARNING:" ausgeben, erscheint es sogar in der Fehlerliste als Warnung! – Gombat

6

Wie Sie jetzt herausgefunden haben, ist #warning keine Standardfunktion, daher können Sie sie nicht mit Compilern verwenden, die sie nicht unterstützen. Wenn Sie möchten, dass Ihr Code plattformübergreifend funktioniert, verwenden Sie #warning überhaupt nicht - oder zumindest nicht in Code, den MSVC verarbeiten soll (er könnte durch #ifdef oder gleichwertig vorverarbeitet werden). Daraus folgt:

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

Aber das wiederholt die Nachricht und ich bin sicher, dass Sie im Sinne hatten, nicht das zu tun - und es ist sperrig; Sie würden es nur sehr selten benutzen. Sie müssen möglicherweise auch mit anderen Compilern als GCC arbeiten (und ich kenne MSVC nicht genug, um zu wissen, wie man es zuverlässig identifiziert).

Es wäre nett, wenn #warning standardisiert wären; es ist in C99 nicht standardisiert.

(Es war einmal auf vor langer Zeit, eine Frage SO über solche Merkmale, die C und #warning kam hinzugefügt werden könnte.)

Siehe auch: Portability of #warning preprocessor directive

3

Wachen sie mit # wenn Aussagen. Suchen Sie nach einem Symbol, das von einem Compiler definiert wird, aber nicht von dem anderen.

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

Art von hässlich, aber ich sehe keinen anderen Weg.

+0

Sie diese während hinzugefügt wurde ich aus meiner Antwort Bearbeitung und das Hinzufügen der inversen Test. .. Ich denke _MSC_VER ist das Gegenstück von __GNUC__! Vielen Dank. –

+0

_MSC_VER deklariert nicht nur, dass Sie in Microsoft C++ sind, sondern definiert auch, welche Version Sie verwenden. –

1

Wenn Sie möchten, können Sie auf die oben genannten Lösungen eine Kleinigkeit hinzufügen (#pragma warning) vor Ihre #pragma message:

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

Dieses kleine Add-In erzeugt echte Warnung, und sieht nicht schlecht im Fenster von VC. Zum Beispiel:

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) 

Normalerweise verwende ich diese Methode, um Warnungen nicht zu leise war, wie im Fall Code ohne #pragma warning().

Zum Beispiel kann die Form von Warnungen zu leise (für mich natürlich).

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

Allerdings nur eine kleine Kosmetik.

+0

Eine einfachere Möglichkeit, den MSVC-Compiler zum Zählen/Anzeigen einer tatsächlichen Warnung zu zwingen, ist der Text ** ": warning:" ** in der Ausgabenachricht. – Matthew

Verwandte Themen