2012-03-12 13 views
8

Poniższy kod NIE blokuje żadnych ostrzeżeń kompilatora C4503, ale eliminuje ostrzeżenia C4244.Czy można wyłączyć ostrzeżenie kompilatora C4503?

#pragma warning(push) 
#pragma warning(disable:4503) 
#pragma warning(disable:4244) 

#include <map> 
#include <string> 

int main(int argc, char *argv[]) 
{ 
    class Field; 
    typedef std::map<std::string, Field * > Screen; 
    typedef std::map<std::string, Screen> WebApp; 
    typedef std::map<std::string, WebApp> WebAppTest; 
    typedef std::map<std::string, WebAppTest> Hello; 
    Hello MyWAT; // The C4503 error is NOT suppressed 

    int a; 
    a = 5.0f; // The C4244 error is suppressed 
} 

#pragma warning(pop) 

Proszę definitywnie wyjaśnić, dlaczego ostrzeżenia C4503 nie są pomijane. Uwaga: może to wynikać z podobnego powodu, o którym mowa w How can I work around warning C4505 in third party libraries?.

Aby uzyskać więcej informacji, należy zapoznać się z numerami this i this.

Używam Visual Studio 2008 na komputerze z systemem Windows 7.

+2

Bez dodatkowego kontekstu, w którym wyłączasz ostrzeżenie, trudno jest znaleźć rozwiązanie. Zgaduję: Wyłączyłeś ostrzeżenie wokół kodu, który tworzy szablon potwora, ale musisz wyłączyć przed nagłówkiem, w którym zdefiniowany jest szablon. – Xeo

+0

@Xeo Mam podwójnie sprawdzone i potwierdziłem, że to nie jest problem. –

+0

Powinieneś pomyśleć o usunięciu tych ostrzeżeń, ponieważ mogą one później prowadzić do problemów, np. podczas łączenia. – PlasmaHH

Odpowiedz

3

Niewyraźne z kontekstu, ale może masz zbyt wiele stwierdzeń #pragma? MSDN mówi:

The compiler only supports up to 56 #pragma warning statements in a compiland. 
+0

Mam podwójnie sprawdzone i potwierdziłem, że to nie jest problem. –

+2

Następnie sugeruję podanie minimalnego przykładu. Jeśli nie, nie mamy szans, ale zgadujemy, a to nie jest zbyt satysfakcjonujące. – Matthias

+1

Moje pytanie zostało zmodyfikowane, aby dostarczyć działający przykład problemu. –

2

trochę dziwne, ale można wyłączyć to ostrzeżenie za pomocą dokładnego kodu tylko poprzez usunięcie #pragma warning(pop). Nie rozumiem dlaczego.

Powiedziałbym, że jestem na VS2010 C++ Express edition.

+0

używając go gdzie? – PlasmaHH

+1

Stworzyłem nową aplikację konsolową CLR, zastąpiłem zawartość projectname.cpp powyższym kodem, dodano '#include" stdafx.h "' i skompilowałem, i dało mi mnóstwo ostrzeżeń. Potem skomentowałem ostatnie ostrzeżenie #pragma (pop) i nie było żadnych ostrzeżeń. – demoncodemonkey

+0

Mogę sobie wyobrazić, że faza, która generuje te ostrzeżenia, jest późniejsza, po wszelkiego rodzaju sytuacjach i semantykach, w których pop już jest aktywny. – PlasmaHH

1

Może stwierdzenie oczywistości, ale można użyć ustawień IDE, aby usunąć to (i inne) ostrzeżenia całkowicie, jak wyjaśniono here.

To było jedyne rozwiązanie, które zadziałało dla mnie i było uzasadnione, gdy dowiedziałem się, że Boost ma włączone lub wyłączone zasady ostrzegania, które zmieniają zachowanie instrukcji #pragma push/pop/enable/disable.

+0

To również działa, aby wyłączyć tekst ostrzeżenia w oknie wyjściowym. –

Powiązane problemy