Jak pozbyć się ostrzeżenia o „nieużywanej zmiennej” w Xcode?


98

Dokładnie rozumiem, dlaczego pojawiają się nieużywane ostrzeżenia o zmiennych. Generalnie nie chcę ich tłumić, ponieważ w większości przypadków są niezwykle przydatne. Rozważ jednak następujący (wymyślony) kod.

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode zgłasza, że savedjest nieużywaną zmienną, chociaż oczywiście tak nie jest. Podejrzewam, że to dlatego, że NSAssert1jest to makro. NS_BLOCK_ASSERTIONSMakro nie zdefiniowane, więc twierdzenia Objective C są zdecydowanie włączone.

Chociaż niczego to nie boli, uważam to za nieporządne i denerwujące i chcę to stłumić, ale nie jestem pewien, jak to zrobić. Przypisanie zmiennej do samej siebie usuwa ostrzeżenie kompilatora, ale wolałbym zrobić to we „właściwy” sposób, jeśli coś takiego istnieje.

Odpowiedzi:


107

Nie jestem pewien, czy jest on nadal obsługiwany w nowym kompilatorze LLVM, ale GCC ma atrybut „nieużywany”, którego można użyć do pominięcia tego ostrzeżenia:

BOOL saved __attribute__((unused)) = [moc save:&error];

Alternatywnie (w przypadku, gdy LLVM nie obsługuje powyższego), możesz podzielić deklarację zmiennej na oddzielną linię, gwarantując, że zmienna będzie „używana” niezależnie od tego, czy makro się rozwinie, czy nie:

BOOL saved = NO;
saved = [moc save:&error];

107

Używając Xcode 4.3.2 i odkryłem, że to wydaje się działać (mniej pisania)

BOOL saved __unused;

To nie działa dla mnie, dostaję ostrzeżenie, że'saved' was marked as unused but was used
Heath Borders

37

W Xcode możesz ustawić ostrzeżenia dla „Nieużywanych zmiennych”. Przejdź do „Ustawień budowania” dla celu i filtruj ze słowem „nieużywane”

Oto zrzut ekranu: Zrzut ekranu ustawień Builld

Sugeruję, aby zmienić to tylko dla debugowania. W ten sposób niczego nie przegapisz w swojej wydanej wersji.


37
Czy przegapiłeś część pytania, w której Gregory powiedział: „Generalnie nie chcę ich tłumić, ponieważ są one niezwykle przydatne w większości przypadków”?
Sherm Pendley,

8
@ShermPendley Niezależnie od tego, jest to nadal przydatne, odpowiadało na moje pytanie, jak wyłączyć to globalnie.
rafian

9
wyłączenie ostrzeżeń to świetny sposób na pominięcie błędów. Gorąco odradzam.
orion elenzil

2
@orionelenzil - cóż, tak i nie. Istnieje prawdziwy problem z interfejsem z fałszywymi alarmami. Ostrzeżenie pojawia się stale podczas pisania kodu, jeśli nie dotarłeś do części kodu, w której używasz zmiennej. Z czasem nauczy Cię to ignorować ostrzeżenie, co oznacza, że ​​możesz przegapić ważniejsze błędy. Lepiej byłoby mieć możliwość wyeliminowania błędu w aktywnie edytowanych blokach kodu.
TechZen

Cześć, działa dobrze, jeśli ustawię NIE. ale mam wątpliwości: muszę ustawić debugowanie i wydanie NIE ya tylko Nieużywana zmienna: NIE? który muszę ustawić. Jeśli ustawię Totally NO, to nie stworzy żadnego problemu podczas wydania na?
SR Nayak

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Spróbuj w ten sposób. To działa dla mnie. Dla ciebie też zadziała.


To nie działa dla mnie, dostaję ostrzeżenie, że'saved' was marked as unused but was used
Heath Borders

15

Jedynym prostym i przenośnym sposobem oznaczenia zmiennej jako używanej jest… jej użycie.

BOOL saved = ...;
(void)saved; // now used

Możesz być zadowolony z już opisanych rozszerzeń specyficznych dla kompilatora.


2
Wolę to od brzydkiej #pragmy opisanej powyżej.
Northernman

1
Hej stary, fajna wskazówka
dimazava

14
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

ŹRÓDŁO


Jest to najczystsze podejście, ponieważ wyłącza tylko ostrzeżenie między tymi #pragmami
cornr


5

Można ustawić ostrzeżenie „Nie” kompilatora LLVM 2.0 dla „Wersja”wprowadź opis obrazu tutaj


4

To jest sposób, w jaki robisz to w C, a zatem także w Objective-C.

Nawet jeśli nie masz włączonych ostrzeżeń, zawsze dobrze jest oznaczyć zwracaną wartość jako jawnie zignorowaną. Ma to również na celu pokazanie innym programistom, że nie tylko zapomnieliście o zwracanej wartości - faktycznie zdecydowaliście się ją zignorować.

(void)[moc save:&error];

EDYCJA: Kompilatory ignorują rzutowania do void, więc nie powinno to wpływać na wydajność - to tylko ładna, czysta ludzka adnotacja.


W niektórych kontekstach MUSISZ użyć tego hacka, aby uzyskać kod Objective-C do kompilacji. Używanie (void)to najwyraźniejszy sposób, dzięki!
Dan Rosenstark

1

Niech zajmie dwie linie. Oddziel deklarację i wartość domyślną

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
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.