Czy istnieje sposób na wyłączenie tylko jednego wiersza ostrzeżenia w pliku CPP w programie Visual Studio?
Na przykład, jeśli złapię wyjątek i go nie obsłużę, otrzymam błąd 4101 (zmienna lokalna bez odniesienia). Czy istnieje sposób, aby zignorować to tylko w tej funkcji, ale w przeciwnym razie zgłosić to w jednostce kompilacji? W tej chwili umieszczam #pragma warning (disable : 4101)
na górze pliku, ale to oczywiście wyłącza go dla całego urządzenia.
c++
visual-c++
warnings
pragma
Ciastko
źródło
źródło
catch (const std::exception& /* unnamed */) {.... }
. Nie odpowiada na Twoje pytanie, ale może rozwiązać Twój problem.Odpowiedzi:
źródło
clang
nie wydaje się wspierać ten pragmy, ale można osiągnąć ten sam efekt z#pragma clang diagnostic push
,#pragma clang diagnostic ignored "-Wunused-variable"
, i#pragma clang diagnostic pop
. Zobacz „Kontrolowanie diagnostyki poprzez pragmy” w podręczniku użytkownika Clang/wd4101
. Zauważ, że:
między flagą a liczbą nie ma normy i nie możesz utworzyć listy liczb oddzielonych przecinkami. W przypadku innych kompilatorów może to być/nowarn:4101
zamiast tego.Jeśli chcesz pominąć ostrzeżenie tylko w jednym wierszu kodu, możesz użyć specyfikatora
suppress
ostrzeżenia :W przypadku pojedynczego wiersza kodu działa to tak samo, jak napisanie następującego:
źródło
suppress
specyfikator działa na pojedynczej, wstępnie przetworzonej linii kodu. Jeśli następująca po niej linia#pragma warning(suppress: ...)
jest#include
dyrektywą (która rozszerza plik, do którego odwołuje się jej parametr, do aktualnej jednostki kompilacji), efekt dotyczy tylko pierwszej linii tego pliku. Powinno to być oczywiste, ponieważ ostrzeżenia są generowane przez kompilator. Kompilator działa na wstępnie przetworzonym kodzie.#pragma
push / pop są często rozwiązaniem tego rodzaju problemów, ale w takim przypadku dlaczego po prostu nie usuniesz zmiennej, do której nie ma odniesienia?źródło
:P
).Użyj
#pragma warning ( push )
, następnie#pragma warning ( disable )
umieść kod, a następnie użyj#pragma warning ( pop )
zgodnie z opisem tutaj :źródło
Przykład:
Ta pragma dotyczy języka C ++, począwszy od programu Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx
Pragma NIE jest poprawna dla języków C # za pośrednictwem programu Visual Studio 2005 do programu Visual Studio 2015.
Błąd: „Oczekiwano wyłączenia lub przywrócenia”.
(Myślę, że nigdy nie zaimplementowali
suppress
...)https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx
C # wymaga innego formatu. Wyglądałoby to tak (ale nie działało):
Zamiast tego
suppress
musiszdisable
ienable
:To jest TAK brzydkie, myślę, że mądrzej jest po prostu zmienić styl:
źródło
Zamiast umieszczać go na górze pliku (lub nawet pliku nagłówkowego), po prostu zawiń kod, o który chodzi
#pragma warning (push)
,#pragma warning (disable)
i dopasuj#pragma warning (pop)
, jak pokazano tutaj .Chociaż istnieje kilka innych opcji, w tym
#pramga warning (once)
.źródło
Można również użyć
UNREFERENCED_PARAMETER
zdefiniowanego wWinNT.H
. Definicja jest po prostu:I używaj go jak:
Dlaczego miałbyś go używać, możesz argumentować, że możesz po prostu pominąć samą nazwę zmiennej. Cóż, są przypadki (inna konfiguracja projektu, kompilacje debugowania / wydania), w których zmienna może być faktycznie używana. W innej konfiguracji zmienna ta nie jest używana (stąd ostrzeżenie).
Niektóre statyczne analizy kodu mogą nadal dawać ostrzeżenie o tej nieuzasadnionej instrukcji (
wParam;
). W takim przypadku możesz użyćDBG_UNREFERENCED_PARAMETER
tego samego, coUNREFERENCED_PARAMETER
w kompilacjach do debugowania i robi toP=P
w kompilacji wydania.źródło
[[maybe_unused]]
atrybutJeśli chcesz wyłączyć
unreferenced local variable
zapis w jakimś nagłówkuI użyć
źródło
(void)unusedVar;
?(void)unusedVar;?
nie jest zgodny ze standardem C ++.static_cast<void>(unusedVar)
.Any expression can be explicitly converted to type “cv void.” The expression value is discarded
zgodnie z którym możesz pisaćstatic_cast<void>(unusedVar)
istatic_cast<const void>(unusedVar)
istatic_cast<volatile void>(unusedVar)
. Wszystkie formularze są ważne. Mam nadzieję, że to wyjaśnia twoje wątpliwości.W niektórych sytuacjach musisz mieć nazwany parametr, ale nie używasz go bezpośrednio.
Na przykład, natknąłem się na to w VS2010, kiedy 'e' jest używane tylko w
decltype
instrukcji, kompilator skarży się, ale musisz mieć nazwaną zmiennąe
.Wszystkie powyższe nie-
#pragma
sugestie sprowadzają się do dodania jednego stwierdzenia:źródło
jak wspomniał @rampion, jeśli jesteś w clang gcc, ostrzeżenia są wyświetlane według nazwy, a nie numeru i musisz to zrobić:
ta informacja pochodzi stąd
źródło