Xcode'da uyarıları bastırmanın bir yolu var mı?


119

Xcode'da uyarıları bastırmanın bir yolu var mı?

Örneğin, belgelenmemiş bir yöntemi çağırıyorum ve yöntem başlıkta olmadığı için derleme konusunda bir uyarı alıyorum. Uyarıyı durdurmak için başlığıma ekleyebileceğimi biliyorum, ancak uyarıyı bastırmak için başlığa eklemekten başka bir yol olup olmadığını merak ediyorum (böylece başlıkları temiz ve standart tutabilirim)? Pragma veya başka bir şey?


evet, bazen derleyiciye (ona göre) kullanılmayan değişkenler hakkında sizi uyarmamasını söyleme ihtiyacı duyarsınız ama aslında onu şu şekilde kullanıyor olabilirsinizBOOL 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

Yanıtlar:


145

Uyarıları dosya bazında devre dışı bırakmak için Xcode 3 ve llvm-gcc-4.2 kullanarak şunları kullanabilirsiniz:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Uyarı adının bazı gcc uyarı bayrakları olduğu yerde.

Bu, komut satırındaki tüm uyarı bayraklarını geçersiz kılar. Yine de tüm uyarılarla çalışmaz. CFLAGS'nize -fdiagnostics-show-seçeneğini ekleyin ve bu uyarıyı devre dışı bırakmak için hangi bayrağı kullanabileceğinizi görebilirsiniz.


Teşekkürler ! Tam olarak ihtiyacım olan şey!
Moszi

28
Uyarı kodunu almanın kolay yolu: Günlük Gezgini'ne gidin (Command + 7), en üst yapıyı seçin, günlüğü genişletin (sağdaki '=' düğmesi) ve aşağıya kaydırın.
Neal Ehardt


2
Görünüşe #pragma GCC diagnostic ignored "-Wwarning-flag"göre zaten kaldırılmış
allenlinli

1
@allenlinli hala orada, sadece gcc.gnu.org/onlinedocs/gcc/Warning-Options.htmlwarning-flag
Fonix

49

Kullanılmayan değişken uyarılarını bastırmanın daha basit bir yolu var :

#pragma unused(varname)

DÜZENLEME: kaynak: http://www.cocoadev.com/index.pl?XCodePragmas

GÜNCELLEME: Yeni bir çözümle karşılaştım, daha sağlam bir çözüm

  1. Proje> Aktif Hedefi Düzenle> Oluştur sekmesini açın.
  2. Altında User-Defined: anahtarı bulun (veya bulamazsanız oluşturun): olarak GCC_WARN_UNUSED_VARIABLEayarlayın NO.

EDIT-2 Örneği:

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

derleyici için kullanılmayan değişken uyarısı gösterir ok.

Çözüm:

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

Not: Ayrıca diğer uyarıyı ayarlayabilir / sıfırlayabilirsiniz GCC_WARN_ABOUT_RETURN_TYPE::YES/NO


31
Daha da basit olanı, değişken bildiriminden önce __unused koymaktır.
Mark Leonard

@ mark-leonard ayrı bir cevap olmalıydı, bunu günlerdir arıyordum. Umutsuzluktan yorumları okumaya başlamalıydım. Teşekkür ederim.
Repose

35

Gcc için kullanabilirsiniz

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

Buradan GCC pragması hakkında bilgi edinebilir ve bir uyarının uyarı kodunu almak için Rapor Gezgini'ne (Command + 9) gidin, en üst yapıyı seçin, günlüğü genişletin (sağdaki '=' düğmesi) ve altta ve orada uyarı kodunuz bunun gibi köşeli parantezler içinde[-Wshadow-ivar]

Clang için kullanabilirsiniz

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

4
Clang, mevcut kaynak koduyla uyumluluk için GCC'nin pragmasını destekler. Yani gcc formatında pragma yazmanız yeterlidir.
Allen

1
Xcode 5.0'dan başlayarak, Clang sağlanan tek derleyiciydi. Şimdi clang format pragma kullanmaya başlayabilirsiniz.
allenlinli

27

Tek bir dosya için bir uyarıyı geçersiz kılmak için aşağıdakileri yapın:

xcode projesindeki dosyayı seçin. bilgi al'a basın yapı seçeneklerinin bulunduğu sayfaya gidin bir uyarıyı iptal etmek için -Wno- yazın:

-Wno-

Örneğin

-Wno-kullanılmayan parametreli

Yapım sekmesi sayfasının altında bulunan GCC uyarılarına proje ayarlarına bakarsanız uyarının adını alabilirsiniz, her bir uyarıya tıkladığınızda size uyarı parametresi adını söyleyecektir:

Örneğin

Bir işlev parametresi bildirimi dışında kullanılmadığında uyar. [GCC_WARN_UNUSED_PARAMETER, -Wunused-parametre]


2
Bu ... o tetik derleyici uyarılarına olur değiştirmek istemediğiniz bir kod tabanı dahil ettik kodu için mükemmel bir çözümdür
Mark Beaton

Harika bir yol gibi görünüyor, ancak bunu XCode 4
Santthosh


benimki gibi tek bir sorun için bastırma uyarısına ihtiyacınız varsa: ...m:45:69: Incompatible pointer types sending...derleme açıklamasını açtım ve şu uyarıyı buldum: olarak [-Wincompatible-pointer-types]yeniden adlandırdım ve dosyama -Wno-incompatible-pointer-typesbir bayrak olarak ekledim .m... bum artık uyarı yok ... +10 eğer yapabilirim
Nicos Karalis

5

Objective-C ile, bir dizi ciddi hata yalnızca uyarı olarak görünür. Sadece uyarıları asla devre dışı bırakmakla kalmıyorum , normalde "Uyarıları hata olarak değerlendir" (-Hata) seçeneğini açıyorum.

Kodunuzdaki her tür uyarı, işleri doğru bir şekilde yaparak (normalde nesneleri doğru türe çevirerek) veya ihtiyacınız olduğunda prototipleri bildirerek önlenebilir.


14
Bu iyi bir genel tavsiye olsa da soruyu yanıtlamaz. Tüm uyarılar kritik veya ciddi değildir; çoğu oldukça önemsizdir. Bir kişinin bir üçüncü taraf kitaplığı kullanması gerektiğini ve herhangi bir nedenle onu değiştiremeyeceğini varsayalım (eski kod tabanı, üçüncü kişi tarafından bağlanması amaçlanan kod, patron şartnamesi, vb.) Belirli önemsiz uyarıları bastırmak bu durumlarda oldukça kabul edilebilir.
Paul Legato

5

Uyarıdan kurtulmak için: söz konusu nesne için bir kategori arayüzü oluşturmayı deneyin

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

Bir kenara, gönderi kodunda belgelenmemiş yöntemleri çağırmamanızı şiddetle tavsiye ediyorum . Arayüz değişebilir ve değişecektir ve bu sizin hatanız olacaktır.


Bunu ben de yapıyorum. Kategorimi "Özel" olarak adlandırıyorum ve .m dosyasının en üstüne koyuyorum ... Yalnızca dosya içinde kullanılan yöntemleri bildirmenin bir yolu olarak hizmet ediyor. Özel bir başlık dosyasının daha standart olacağını kabul ediyorum, ancak uygulamaya tamamen dahil edilmesi gereken (özel) bir şey için dosyalar arasında sürekli olarak gidip gelmek can sıkıcı.
Pat Niemeyer

Dolayısıyla, yöntemi herhangi bir şey kullanmadan önce uygulamanın eski C hilesini kullanabileceğiniz ortaya çıktı. O zaman kendinize bir yerel dosya yöntemine sahipsiniz. Yine de özel olmadığını düşünüyorum, bu nedenle diğer dosyalar muhtemelen bu şekilde tanımladığınız seçiciye bir mesaj gönderebilir.
Mark Pauley


3

'Belgelenmemiş.h' adında yeni, ayrı bir başlık dosyası oluşturun ve bunu projenize ekleyin. Ardından, belgelenmemiş işlevleri çağırmak istediğiniz her sınıf için bir arabirim bloğu oluşturun ve her birine '(Belgelenmemiş)' kategorisi verin. Ardından, bu başlık dosyasını PCH'nize ekleyin. Bu şekilde, orijinal başlık dosyalarınız temiz kalır, korunacak yalnızca bir dosya daha vardır ve tüm uyarıları yeniden etkinleştirmek için PCH'nizdeki bir satırı yorumlayabilirsiniz.

Ayrıca bu yöntemi 'Amortismanlı.h' içindeki '(Amortisman)' kategorisiyle amortismana tabi işlevler için kullanıyorum.

en iyi bölüm, tek tek prototiplere yorum ekleyerek veya açıklamalarını kaldırarak bireysel uyarıları seçmeli olarak etkinleştirebilmeniz / devre dışı bırakabilmenizdir.


1

Bu özel uyarıyı bastırmak güvenli değildir. Derleyicinin argüman türlerini bilmesi ve doğru kodu üretmek için bir yönteme geri dönmesi gerekir.

Örneğin, böyle bir yöntemi çağırıyorsanız

[foo doSomethingWithFloat: 1.0];

bu bir float alır ve görünür bir prototip yoktur, o zaman derleyici yöntemin float değil, double aldığını tahmin eder. Bu, çökmelere ve yanlış yorumlanan değerlere neden olabilir. Yukarıdaki örnekte, intel makineleri gibi küçük bir endian makinede, alıcı yöntemi 1'in değil 0'ın geçtiğini görecektir.

Nedenini i386 ABI belgelerinde okuyabilir veya sadece uyarılarınızı düzeltebilirsiniz. :-)


2
İyi bir tavsiye, ancak yukarıdaki gibi soruya cevap vermiyor.
Paul Legato
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.