Czy istnieje sposób na pominięcie ostrzeżeń w Xcode?


119

Czy istnieje sposób na pominięcie ostrzeżeń w Xcode?

Na przykład wywołuję nieudokumentowaną metodę, a ponieważ metody nie ma w nagłówku, pojawia się ostrzeżenie przy kompilacji. Wiem, że mogę dodać go do mojego nagłówka, aby zatrzymać ostrzeżenie, ale zastanawiam się, czy istnieje sposób inny niż dodanie go do nagłówka (dzięki czemu mogę zachować czyste i standardowe nagłówki), aby wyłączyć ostrzeżenie? Pragma czy coś?


tak, czasami musisz powiedzieć kompilatorowi, aby nie ostrzegał cię o żadnej nieużywanej zmiennej (według niego), ale w rzeczywistości możesz jej używać jakoBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
thesummersign

Odpowiedzi:


145

Aby wyłączyć ostrzeżenia dla poszczególnych plików, używając Xcode 3 i llvm-gcc-4.2, możesz użyć:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Gdzie nazwa ostrzeżenia to jakaś flaga ostrzegawcza gcc.

To przesłania wszelkie flagi ostrzegawcze w wierszu poleceń. Jednak nie działa ze wszystkimi ostrzeżeniami. Dodaj -fdiagnostics-show-option do swoich CFLAGS i zobaczysz, której flagi możesz użyć, aby wyłączyć to ostrzeżenie.


Dzięki ! Dokładnie to, czego potrzebowałem!
Moszi

28
Łatwy sposób na uzyskanie kodu ostrzegawczego: przejdź do Nawigatora dziennika (Command + 7), wybierz najwyższą kompilację, rozwiń dziennik (przycisk „=” po prawej stronie) i przewiń w dół.
Neal Ehardt

1
Dla tych, którym zależy, edukacyjne odniesienie do opcji ostrzeżeń GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi

2
Wygląda na #pragma GCC diagnostic ignored "-Wwarning-flag"to, że jest już usunięty
allenlinli

1
@allenlinli nadal tam jest, wystarczy zastąpić warning-flagje jednym z ostrzeżeń wymienionych na gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix

49

istnieje prostszy sposób na pominięcie ostrzeżeń o nieużywanych zmiennych :

#pragma unused(varname)

EDYCJA: źródło: http://www.cocoadev.com/index.pl?XCodePragmas

AKTUALIZACJA: Przyszedłem do nowego rozwiązania, solidniejszego

  1. Otwórz projekt> Edytuj aktywny cel> kartę Kompiluj.
  2. Pod User-Defined: znajdź (lub utwórz, jeśli go nie znajdziesz) klucz: GCC_WARN_UNUSED_VARIABLEustaw go na NO.

Przykład EDIT-2:

BOOL ok = YES;
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

kompilator wyświetla ostrzeżenie o nieużywanych zmiennych dla ok.

Rozwiązanie:

BOOL ok = YES;
#pragma unused(ok)
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

PS: Możesz także ustawić / zresetować inne ostrzeżenie GCC_WARN_ABOUT_RETURN_TYPE::YES/NO


31
Jeszcze prostsze jest umieszczenie __unused przed deklaracją zmiennej.
Mark Leonard,

@ mark-leonard powinno być osobną odpowiedzią, szukałem tego od dni. Musiałem zacząć czytać komentarze z desperacji. Dziękuję Ci.
Odpocznij

35

W przypadku gcc możesz użyć

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

Możesz dowiedzieć się o pragmie GCC tutaj i aby uzyskać kod ostrzegawczy ostrzeżenia, przejdź do Nawigatora raportów (Polecenie + 9), wybierz najwyższą kompilację, rozwiń dziennik (przycisk „=” po prawej stronie) i przewiń do na dole i tam twój kod ostrzegawczy jest w takich nawiasach kwadratowych[-Wshadow-ivar]

Do brzęku możesz użyć

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop

4
Clang wspiera pragmę GCC dotyczącą zgodności z istniejącym kodem źródłowym. Więc wystarczy napisać pragmę formatu gcc.
Allen

1
Począwszy od Xcode 5.0, Clang był jedynym dostarczonym kompilatorem. Więc możesz teraz potrzebować użyć pragmy formatu clang.
allenlinli

27

Aby usunąć ostrzeżenie dotyczące pojedynczego pliku, wykonaj następujące czynności:

wybierz plik w projekcie xcode. naciśnij get info przejdź do strony z opcjami budowania wpisz -Wno-, aby zanegować ostrzeżenie:

-Wnie-

na przykład

-Wno-nieużywany-parametr

Możesz uzyskać nazwę ostrzeżenia, jeśli spojrzysz na ustawienia projektu, spójrz na ostrzeżenia GCC znajdujące się na dole strony zakładki kompilacji, klikając każde ostrzeżenie, a zobaczysz nazwę parametru ostrzeżenia:

na przykład

Ostrzegaj, gdy parametr funkcji nie jest używany poza deklaracją. [GCC_WARN_UNUSED_PARAMETER, -Wunused-parameter]


2
Jest to doskonałe rozwiązanie, gdy włączyłeś kod z bazy kodu, której nie chcesz modyfikować, co powoduje wyzwolenie ostrzeżeń kompilatora ...
Mark Beaton

Wydaje się, że to świetny sposób, ale wszelkie pomysły, jak to zrobić w XCode 4
Santthosh,

2
Moje rozwiązanie znalazłem tutaj dla XCode 4 stackoverflow.com/questions/6057192/…
Santthosh

jeśli potrzebujesz ostrzeżenia o wyłączeniu tylko dla jednego problemu, takiego jak mój: ...m:45:69: Incompatible pointer types sending...otworzyłem wyjaśnienie kompilacji i znalazłem to ostrzeżenie: [-Wincompatible-pointer-types]właśnie zmieniłem nazwę na -Wno-incompatible-pointer-typesi dodałem jako flagę do mojego .mpliku ... bum, nie ma więcej ostrzeżeń ... +10 jeśli mógłbym
Nicos Karalis

5

W przypadku Objective-C szereg poważnych błędów pojawia się tylko jako ostrzeżenia. Nie tylko nigdy nie wyłączam ostrzeżeń, ale zwykle włączam opcję „Traktuj ostrzeżenia jako błędy” (-Werror).

Każdego typu ostrzeżenia w kodzie można uniknąć, wykonując czynności poprawnie (zwykle rzutując obiekty na właściwy typ) lub deklarując prototypy, gdy ich potrzebujesz.


14
Chociaż jest to dobra rada ogólna, nie odpowiada ona na pytanie. Nie wszystkie ostrzeżenia są krytyczne lub poważne; wiele z nich jest dość trywialnych. Załóżmy, że trzeba korzystać z biblioteki innej firmy i nie można jej modyfikować z jakiegokolwiek powodu (starsza baza kodu, kod, który ma być powiązany przez stronę trzecią, postanowienie szefa itp.). W takich przypadkach całkowicie dopuszczalne jest pomijanie określonych trywialnych ostrzeżeń.
Paul Legato

5

Aby pozbyć się ostrzeżenia: spróbuj utworzyć interfejs kategorii dla danego obiektu

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

-(void) myMethod {
...
   [theObject theUndocumentedMethod];
...
}

Na marginesie, zdecydowanie odradzam wywoływanie nieudokumentowanych metod w kodzie wysyłkowym. Interfejs może się zmieniać i będzie się zmieniać, a to będzie Twoja wina.


Ja też to robię. Nazywam swoją kategorię „Prywatną” i umieszczam ją na początku pliku .m ... Służy jako sposób na przekazanie dalej deklaracji metod, które są używane tylko w pliku. Zgadzam się, że prywatny plik nagłówkowy byłby bardziej standardowy, ale konieczność ciągłego przeskakiwania między plikami w celu uzyskania czegoś, co naprawdę powinno być w całości zawarte (prywatne) w implementacji, jest denerwujące.
Pat Niemeyer

Okazuje się więc, że możesz użyć starej sztuczki w C, polegającej na zaimplementowaniu metody, zanim cokolwiek jej użyje. W takim razie masz metodę lokalną dla plików. Myślę, że nie jest to jednak prywatne, więc inne pliki mogłyby wysłać wiadomość do selektora, który zdefiniujesz w ten sposób.
Mark Pauley


3

Utwórz nowy, oddzielny plik nagłówkowy o nazwie „Undocumented.h” i dodaj go do swojego projektu. Następnie utwórz jeden blok interfejsu dla każdej klasy, dla której chcesz wywołać funkcje nieudokumentowane, i nadaj każdej kategorii „(Nieudokumentowane)”. Następnie po prostu dołącz ten jeden plik nagłówkowy do swojego PCH. W ten sposób oryginalne pliki nagłówkowe pozostają czyste, jest tylko jeden inny plik do utrzymania i możesz zakomentować jedną linię w swoim PCH, aby ponownie włączyć wszystkie ostrzeżenia.

Używam tej metody również do amortyzowanych funkcji w „Amortyzowane.h” z kategorią „(Amortyzowane)”.

najlepsze jest to, że możesz selektywnie włączać / wyłączać poszczególne ostrzeżenia, komentując lub usuwając komentarze z poszczególnych prototypów.


1

Zniesienie tego konkretnego ostrzeżenia nie jest bezpieczne. Kompilator musi znać typy argumentów i powrócić do metody, aby wygenerować poprawny kod.

Na przykład, jeśli wywołujesz taką metodę

[foo doSomethingWithFloat: 1.0];

który przyjmuje wartość zmiennoprzecinkową i nie ma widocznego prototypu, kompilator zgadnie, że metoda przyjmuje wartość typu double, a nie float. Może to spowodować awarie i nieprawidłową interpretację wartości. W powyższym przykładzie, na małej maszynie endian, takiej jak maszyny Intel, metoda odbiornika zobaczy 0, a nie 1.

Możesz przeczytać, dlaczego w dokumentacji i386 ABI , lub możesz po prostu poprawić swoje ostrzeżenia. :-)


2
Dobra rada, ale tak naprawdę nie odpowiada na pytanie, zgodnie z powyższym.
Paul Legato
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.