Apakah ada cara untuk menyembunyikan peringatan di Xcode?

119

Apakah ada cara untuk menyembunyikan peringatan di Xcode?

Misalnya saya memanggil metode tidak berdokumen dan karena metode tersebut tidak ada di header saya mendapatkan peringatan tentang kompilasi. Saya tahu saya bisa menambahkannya ke tajuk saya untuk menghentikan peringatan, tetapi saya bertanya-tanya apakah ada cara selain menambahkannya ke tajuk (jadi saya bisa menjaga tajuk tetap bersih dan standar) untuk menekan peringatan? Pragma atau sesuatu?

kdbdallas.dll
sumber
ya, terkadang Anda merasa perlu mengatakan kepada compiler untuk tidak memperingatkan Anda tentang variabel yang tidak digunakan (menurut dia) tetapi sebenarnya Anda mungkin menggunakannya sebagaiBOOL 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

Jawaban:

145

Untuk menonaktifkan peringatan per file, menggunakan Xcode 3 dan llvm-gcc-4.2 Anda dapat menggunakan:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Di mana nama peringatan adalah beberapa bendera peringatan gcc.

Ini mengesampingkan semua tanda peringatan pada baris perintah. Itu tidak bekerja dengan semua peringatan. Tambahkan -fdiagnostics-show-option ke CFLAGS Anda dan Anda dapat melihat flag mana yang dapat Anda gunakan untuk menonaktifkan peringatan itu.

robottobor
sumber
Terima kasih! Persis apa yang saya butuhkan!
Moszi
28
Cara mudah untuk mendapatkan kode peringatan: buka Log Navigator (Command + 7), pilih build paling atas, perluas log (tombol '=' di sebelah kanan), dan gulir ke bawah.
Neal Ehardt
1
Bagi mereka yang peduli, referensi pendidikan opsi peringatan GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi
2
Tampaknya #pragma GCC diagnostic ignored "-Wwarning-flag"sudah dihapus
allenlinli
1
@allenlinli masih ada, Anda hanya perlu mengganti warning-flagdengan salah satu peringatan yang tercantum di gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix
49

ada cara yang lebih sederhana untuk menyembunyikan peringatan variabel yang tidak digunakan :

#pragma unused(varname)

EDIT: sumber: http://www.cocoadev.com/index.pl?XCodePragmas

PEMBARUAN: Saya menemukan solusi baru, yang lebih kuat

  1. Buka Proyek> Edit Target Aktif> tab Bangun.
  2. Di bawah User-Defined: temukan (atau buat jika Anda tidak menemukannya) kunci: GCC_WARN_UNUSED_VARIABLEsetel ke NO.

EDIT-2 Contoh:

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

kompilator menunjukkan peringatan variabel yang tidak digunakan untuk ok .

Larutan:

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

NB: Anda juga dapat mengatur / mengatur ulang peringatan lainnya GCC_WARN_ABOUT_RETURN_TYPE::YES/NO

thesummersign
sumber
31
Lebih sederhana lagi adalah meletakkan __unused sebelum deklarasi variabel.
Mark Leonard
@ mark-leonard seharusnya jawaban terpisah, saya sudah mencari ini selama berhari-hari. Saya harus mulai membaca komentar karena putus asa. Terima kasih.
Istirahat
35

Untuk gcc Anda bisa menggunakan

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

Anda dapat mempelajari pragma GCC di sini dan untuk mendapatkan kode peringatan peringatan, buka Report Navigator (Command + 9), pilih build paling atas, perluas log (tombol '=' di sebelah kanan), dan gulir ke bawah dan di sana kode peringatan Anda berada dalam tanda kurung siku seperti ini[-Wshadow-ivar]

Untuk dentang Anda bisa menggunakan

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
Inder Kumar Rathore
sumber
4
Clang mendukung pragma GCC untuk kompatibilitas dengan kode sumber yang ada. Jadi Anda hanya perlu menulis pragma format gcc.
Allen
1
Dimulai dengan Xcode 5.0, Clang adalah satu-satunya kompiler yang disediakan. Jadi Anda mungkin perlu menggunakan format dentang pragma sekarang.
allenlinli
27

Untuk menekan peringatan untuk file individu lakukan hal berikut:

pilih file di proyek xcode. tekan dapatkan info, buka halaman dengan opsi build, masukkan -Tidak- untuk meniadakan peringatan:

-Tidak-

misalnya

-Wno-unused-parameter

Anda bisa mendapatkan nama peringatan jika Anda melihat pada pengaturan proyek, lihat peringatan GCC yang terletak di bagian bawah halaman tab build, dengan mengklik setiap peringatan itu akan memberi tahu Anda nama parameter peringatan:

misalnya

Peringatkan setiap kali parameter fungsi tidak digunakan selain dari deklarasinya. [GCC_WARN_UNUSED_PARAMETER, -Wunused-parameter]

AndersK
sumber
2
Ini adalah solusi yang sangat baik ketika Anda telah memasukkan kode dari basis kode yang tidak ingin Anda ubah yang kebetulan memicu peringatan compiler ...
Mark Beaton
Sepertinya cara yang bagus, tapi ada ide bagaimana Anda melakukan ini di
XCode
2
Menemukan solusi saya di sini untuk
XCode
jika Anda memerlukan peringatan supress hanya untuk satu masalah, seperti masalah saya: ...m:45:69: Incompatible pointer types sending...saya membuka penjelasan build dan menemukan peringatan ini: [-Wincompatible-pointer-types]saya baru saja mengganti namanya -Wno-incompatible-pointer-typesdan menambahkannya sebagai bendera ke .mfile saya ... boom tidak ada lagi peringatan ... +10 jika saya bisa
Nicos Karalis
5

Dengan Objective-C, sejumlah kesalahan serius hanya muncul sebagai peringatan. Tidak hanya saya tidak pernah menonaktifkan peringatan, saya biasanya mengaktifkan "Perlakukan peringatan sebagai kesalahan" (-Kesalahan).

Setiap jenis peringatan dalam kode Anda dapat dihindari dengan melakukan sesuatu dengan benar (biasanya dengan mentransmisikan objek ke jenis yang benar) atau dengan mendeklarasikan prototipe saat Anda membutuhkannya.

Matt Gallagher
sumber
14
Meskipun ini adalah nasihat umum yang baik, ini tidak menjawab pertanyaan tersebut. Tidak semua peringatan kritis atau serius; banyak yang cukup sepele. Misalkan seseorang diharuskan menggunakan pustaka pihak ketiga dan tidak dapat memodifikasinya, karena alasan apa pun (basis kode lama, kode yang dimaksudkan untuk ditautkan oleh pihak ketiga, ketentuan bos, dll.) Menekan peringatan sepele tertentu cukup dapat diterima dalam kasus ini.
Paul Legato
5

Untuk menghilangkan peringatan: coba buat antarmuka kategori untuk objek yang dimaksud

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

Selain itu, saya sangat menyarankan agar tidak memanggil metode tidak berdokumen dalam kode pengiriman. Antarmuka dapat dan akan berubah, dan itu akan menjadi kesalahan Anda.

Mark Pauley
sumber
Saya melakukan ini juga. Saya menyebut kategori saya "Private" dan meletakkannya di bagian atas file .m ... Ini berfungsi sebagai cara untuk meneruskan mendeklarasikan metode yang hanya digunakan di dalam file. Saya setuju bahwa file header pribadi akan lebih standar, tetapi harus terus-menerus berpindah antar file untuk sesuatu yang benar-benar harus sepenuhnya berisi (pribadi) untuk implementasi itu mengganggu.
Pat Niemeyer
Jadi, ternyata Anda bisa menggunakan trik C lama hanya dengan menerapkan metode sebelum menggunakannya. Kemudian Anda mendapatkan sendiri metode file-local. Saya pikir itu tidak pribadi, jadi file lain mungkin dapat mengirim pesan ke pemilih yang Anda tentukan dengan cara ini.
Mark Pauley
3

Buat file header baru yang terpisah bernama 'Undocumented.h' dan tambahkan ke proyek Anda. Kemudian buat satu blok antarmuka untuk setiap kelas yang ingin Anda panggil fungsi tak berdokumen dan berikan setiap kategori '(Tak berdokumen)'. Kemudian masukkan saja satu file header itu ke PCH Anda. Dengan cara ini file header asli Anda tetap bersih, hanya ada satu file lain yang harus dipertahankan, dan Anda dapat mengomentari satu baris di PCH Anda untuk mengaktifkan kembali semua peringatan.

Saya juga menggunakan metode ini untuk fungsi yang didepresiasi di 'Depreciated.h' dengan kategori '(Depreciated)'.

bagian terbaiknya adalah Anda dapat secara selektif mengaktifkan / menonaktifkan peringatan individu dengan mengomentari atau menghapus komentar pada prototipe individu.

Mark A. Donohoe
sumber
1

Menekan peringatan tertentu itu tidak aman. Kompilator perlu mengetahui tipe argumen dan kembali ke metode untuk menghasilkan kode yang benar.

Misalnya, jika Anda memanggil metode seperti ini

[foo doSomethingWithFloat: 1.0];

yang membutuhkan float, dan tidak ada prototipe yang terlihat, maka compiler akan menebak bahwa metode tersebut membutuhkan double, bukan float. Hal ini dapat menyebabkan error dan nilai yang salah ditafsirkan. Dalam contoh di atas, pada mesin endian kecil seperti mesin intel, metode penerima akan melihat 0 lulus, bukan 1.

Anda bisa membaca alasannya di i386 ABI docs , atau Anda bisa memperbaiki peringatan Anda. :-)

Ken
sumber
2
Saran yang bagus, tetapi tidak benar-benar menjawab pertanyaan, seperti di atas.
Paul Legato