2011-02-09 7 views
11

Przed Xcode 4 z LLVM minął kompilator niezauważony. Przypisanie w ramach warunku jest całkowicie celowe i jest to kakao.if (self = [super init]) - ostrzeżenie LLVM! Jak sobie z tym radzisz?

Xcode 4 z wybranym kompilatorem LLVM nigdy nie zawodzi, a nie tylko w czasie kompilacji, zaraz po wpisaniu pojawia się żółta ikona ostrzegawcza. Wyłączenie ostrzeżeń jako błędów i ignorowanie ostrzeżenia nie wydaje się dobrym pomysłem. Przeniesienie przypisania z nawiasów powoduje marnowanie miejsca. Konieczność wyłączenia tego ostrzeżenia z pragmą przy każdym nowym projekcie stanie się żmudna.

Jak sobie z tym radzisz? Jaki będzie nowy idiom?

+1

Podczas formatowania kodu "marnowanie miejsca" niekoniecznie jest marnotrawstwem. Wcięcie linii w celu odzwierciedlenia struktury programu "marnuje przestrzeń", ale ty tego nie robisz? – JeremyP

+0

Marnowanie miejsca w stosunku do idiomu przypisania/oceny wyłącznie dla siebie. Dużo zależy mi na tym, jak gęsty jest kod i nie mam nic przeciwko dodatkowym liniom, kiedy to sprawia, że ​​rzeczy są wyraźniejsze. –

+1

Uwielbiam podwójny negatywny JeremyP. –

Odpowiedz

18

To jest rzeczywiście bardzo stara ostrzeżenie, to było po prostu domyślnie wyłączone z GCC i Clang 1.6. Xcode powinien dać ci sugestię, jak to naprawić - mianowicie podwoić nawiasy.

if ((self = [super init])) { ... } 

Dodatkowa para parens mówi kompilatorowi, że rzeczywiście zamierzałeś wykonać zadanie w trybie warunkowym.

+0

A więc tak - po prostu założyłem, że wiem, na co narzeka, więc nie przeczytałem tej podpowiedzi. –

4

Wystarczy użyć dwóch par nawiasów, aby było jasne dla kompilatora, że ​​jesteś nadającego na celu:

if ((self = [super init])) 
10

Jeśli utworzyć metodę init, z nowszych makr tekstowych Xcode, można zauważyć, że nowy błogosławiony sposób zrobić init:

- (id)init { 
    self = [super init]; 
    if (self) { 
     <#initializations#> 
    } 
    return self; 
} 

ten sposób unika się ostrzeżenie. Chociaż osobiście w moim własnym kodzie, jeśli natknę się na to, po prostu stosowałem metodę, którą pokazał Kevin.

Coś dobrego do poznania!

+2

Nie jestem pewien, czy możesz nazwać to "błogosławioną drogą".Apple zawsze był niekonsekwentny w zakresie stylów kodowania. –

+1

Nie powiedziałem, że poprzednie style nie były kiedyś błogosławione ... W informatyce żadne błogosławieństwo nie trwa wiecznie. Więc może to bardziej "urok". –

+0

Zarówno odpowiedzi Kevina, jak i Kendall są poprawne. Różnica między nimi polega na tym, że Kendall sprawdza, czy działa inicjalizacja superklasy. Aaron Hillegass wyjaśnia w swojej książce, że niektóre inicjatory zwrócą zero, jeśli inicjalizacja superklasy nie powiedzie się. Mam wrażenie, że taki przypadek byłby patologiczny (awaria podczas uruchamiania), dlatego nie wydaje się, aby istniały przykłady ponownego inicjowania w przypadku zerowego powrotu. Jednak jestem tu poza moją głębią i tylko spekuluję na ten temat. Chciałbym zobaczyć autorytatywne dogłębne wyjaśnienie. –

3

Wyświetl nawigator projektu i wybierz projekt. W wyświetlonym oknie głównym wybierz "Wszystkie". W sekcji "Kompilator LLVM 2.0 - Ostrzeżenia" wybierz "Inne flagi ostrzegawcze". Dodaj flagę "Wno-idiomatyczne-nawiasy" zarówno dla "Debugowania" i "Release". Teraz wyczyść i przekompiluj. enter image description here

0

Jak kilka innych osób zasugerowało, że powinieneś dodać dodatkowy zestaw nawiasów.

jestem daleko od zwykłego guru ekspresji więc nie krępuj się to posprzątać ale to znaleźć i zamienić w Xcode stałej około 95% moich wystąpień:

Replace: if\s*\({1}\s*self\s*={1}(.*)\){1} 
With: if ((self =\1)) 

Bądź ostrożny, ponieważ będzie to również znaleźć, jeśli (self == ...), więc użyj podglądu i odznacz te lub napraw moje wyrażenie :)

I zacznij używać self = ...; jeśli (samo), to jest czystsze.

Powiązane problemy