2009-01-23 11 views
14

W MSVC mam to w nagłówku:ostrzeżenia użytkownika na msvc AND 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)) 

i zrobić

#pragma NOTE(my warning here) 

GCC posiada:

#warning(my warning here) 

jednak MSVC (2003) rzuca dopasowanie gdy widzi #warning i podaje "błąd krytyczny C1021: niepoprawne polecenie preprocesora" ostrzeżenie ""

Co mogę z tym zrobić? Czy istnieje sposób, aby GCC rozpoznało ostrzeżenia MSVC lub MSVC nie zgłaszało błędu ostrzeżenia GCC? Czy jest coś, co mogę zrobić, które działa na obu? Mogę ostrzec mnie przed nieznanymi pragmami, ale to nie jest idealne rozwiązanie.

+0

Czy nie zrobiłabym tego? – Loki

+0

Połączyłem '#ifdef _MSC_VER/GCC ...' do pojedynczego 'PRAGMA_WARNING', http://stackoverflow.com/a/40147989/621706 – fantastory

Odpowiedz

15

Najlepszym rozwiązaniem znalazłem tego problemu jest posiadanie następujących we wspólnym nagłówku:

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

Następnie użyj

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

całym kodzie zamiast #warning

Pod MSVC otrzymasz następujący komunikat:

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

Pod gcc dostaniesz:

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

Nie idealne, ale rozsądnym kompromisem.

+1

Wygląda na to, że Markdown nie chce pracować dla mnie, ale chciałem dodać, że jeśli obsługujesz tylko wersje GCC kompatybilne z C99 i VS2008 +, możesz użyć słowa kluczowego __Pragma GCC (np .: '__Pragma (wiadomość (" OSTRZEŻENIE : "exp))") i słowa kluczowego __pragma firmy MSVC (np .: '__pragma (wiadomość (FILE_LINE_LINK" WARNING: "exp))'), aby skrócić to nieco dalej. Zakładam, że VS2008 jest minimalną obsługiwaną wersją, ponieważ jest to [pierwsza wersja na MSDN] (http://msdn.microsoft.com/en-us/library/d9x1s805 (v = vs.90) .aspx), która ma dokumentację zawierającą odniesienie do tego słowa kluczowego. –

+0

Jeśli na początku wiadomości pojawi się "ostrzeżenie:" zamiast "OSTRZEŻENIE:" (po FILE_LINE_LINK), pojawi się ona na liście błędów jako ostrzeżenie! – Gombat

6

Jak już odkryłeś, #warning nie jest standardową funkcją, więc nie możesz jej używać z kompilatorami, które jej nie obsługują. Jeśli chcesz, aby twój kod działał na różnych platformach, w ogóle nie użyjesz #warning - lub przynajmniej nie w kodzie, który MSVC ma przetwarzać (może być przetworzony przez #ifdef lub równoważny). Stąd:

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

Ale to powtarza komunikat i jestem pewien, że miał na myśli, że nie robi - i to jest nieporęczne; używałbyś go bardzo rzadko. Być może będziesz musiał zająć się także innymi kompilatorami niż GCC (i nie jestem dostatecznie zaznajomiony z MSVC, aby wiedzieć, jak go zidentyfikować w wiarygodny sposób).

Byłoby miło, gdyby standaryzowano #warning; nie jest standaryzowany w C99.

(nie było, dawno dawno temu, SO pytanie o takich cech, które mogą być dodawane do C i #warning wpadł tam.)

Patrz także: Portability of #warning preprocessor directive

3

Straż je z # jeśli instrukcje. Poszukaj symbolu zdefiniowanego przez jeden kompilator, ale nie drugiego.

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

Trochę brzydki, ale nie widzę innej drogi.

+0

Dodałeś to, kiedy nie edytowałem swojej odpowiedzi i dodałem test odwrotny. .. Domyślam się, że _MSC_VER jest odpowiednikiem __GNUC__! Dzięki. –

+0

_MSC_VER nie tylko deklaruje, że znajduje się w Microsoft C++, ale także określa wersję, której używasz. –

1

Jeśli chcesz, możesz dodać do powyższych rozwiązań trochę rzeczy (#pragma warning) przed swój #pragma message:

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

Ten mały dodatek generuje realne ostrzeżenie, a nie wyglądają źle w oknie VC. Na przykład:

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) 

Zwykle używam tej metody do ostrzeżenia nie były zbyt ciche, jak w przypadku kodu bez #pragma warning().

Na przykład forma ostrzeżeń zbyt cicha (dla mnie oczywiście).

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

Jednak tylko małe kosmetyki.

+0

Prostszym sposobem zmuszenia kompilatora MSVC do zliczenia/wyświetlenia faktycznego ostrzeżenia jest umieszczenie w komunikacie wyjściowym tekstu ** ": warning:" **. – Matthew

Powiązane problemy