มีวิธีระงับคำเตือนใน Xcode หรือไม่?


119

มีวิธีระงับคำเตือนใน Xcode หรือไม่?

ตัวอย่างเช่นฉันกำลังเรียกใช้เมธอดที่ไม่มีเอกสารและเนื่องจากเมธอดไม่อยู่ในส่วนหัวฉันจึงได้รับคำเตือนเกี่ยวกับการคอมไพล์ ฉันรู้ว่าฉันสามารถเพิ่มลงในส่วนหัวเพื่อหยุดการเตือนได้ แต่ฉันสงสัยว่ามีวิธีอื่นนอกเหนือจากการเพิ่มลงในส่วนหัว (เพื่อให้ส่วนหัวสะอาดและเป็นมาตรฐาน) เพื่อระงับการเตือนหรือไม่ pragma หรืออะไร?


ใช่บางครั้งคุณจำเป็นต้องพูดกับคอมไพเลอร์ว่าอย่าเตือนคุณเกี่ยวกับตัวแปรที่ไม่ได้ใช้ (ตามเขา) แต่จริงๆแล้วคุณอาจจะใช้มันเป็นBOOL 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

คำตอบ:


145

หากต้องการปิดคำเตือนตามไฟล์โดยใช้ Xcode 3 และ llvm-gcc-4.2 คุณสามารถใช้:

#pragma GCC diagnostic ignored "-Wwarning-flag"

โดยที่ชื่อคำเตือนคือค่าสถานะคำเตือน gcc

สิ่งนี้จะแทนที่แฟล็กคำเตือนบนบรรทัดรับคำสั่ง มันใช้ไม่ได้กับคำเตือนทั้งหมด เพิ่ม -fdiagnostics-show-option ให้กับ CFLAGS ของคุณและคุณสามารถดูว่าคุณสามารถใช้แฟล็กใดเพื่อปิดใช้งานคำเตือนนั้นได้


ขอบคุณ! สิ่งที่ฉันต้องการ!
Moszi

28
วิธีง่ายๆในการรับรหัสคำเตือน: ไปที่ Log Navigator (Command + 7) เลือกบิลด์บนสุดขยายบันทึก (ปุ่ม '=' ทางด้านขวา) และเลื่อนไปที่ด้านล่าง
Neal Ehardt

1
สำหรับผู้ที่สนใจข้อมูลอ้างอิงเพื่อการศึกษาของตัวเลือกคำเตือน GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi

2
ดูเหมือนว่า#pragma GCC diagnostic ignored "-Wwarning-flag"จะถูกลบออกไปแล้ว
allenlinli

1
@allenlinli ยังคงอยู่ที่นั่นคุณเพียงแค่ต้องแทนที่warning-flagด้วยหนึ่งในคำเตือนที่ระบุไว้ในgcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix

49

มีวิธีที่ง่ายกว่าในการระงับคำเตือนตัวแปรที่ไม่ได้ใช้ :

#pragma unused(varname)

แก้ไข: แหล่งที่มา: http://www.cocoadev.com/index.pl?XCodePragmas

อัปเดต: ฉันพบกับโซลูชันใหม่ซึ่งมีประสิทธิภาพมากขึ้น

  1. เปิดแท็บโครงการ> แก้ไขเป้าหมายที่ใช้งานอยู่> สร้าง
  2. ภายใต้การUser-Definedค้นหา (หรือสร้างถ้าคุณไม่พบหนึ่ง) ที่สำคัญ: ตั้งค่าให้GCC_WARN_UNUSED_VARIABLENO

แก้ไข -2 ตัวอย่าง:

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

okแสดงให้เห็นว่าคอมไพเลอร์ที่ไม่ได้ใช้ตัวแปรเตือน

สารละลาย:

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

PS: คุณสามารถตั้งค่า / รีเซ็ตคำเตือนอื่น ๆ ได้ GCC_WARN_ABOUT_RETURN_TYPE::YES/NO


31
ง่ายกว่านั้นคือใส่ __unused ก่อนการประกาศตัวแปร
Mark Leonard

@ mark-leonard น่าจะเป็นคำตอบแยกต่างหากฉันมองหาสิ่งนี้มาหลายวันแล้ว ฉันต้องเริ่มอ่านความคิดเห็นด้วยความสิ้นหวัง ขอบคุณ.
Repose

35

สำหรับ gcc คุณสามารถใช้

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

คุณสามารถเรียนรู้เกี่ยวกับGCC pragma ได้ที่นี่และหากต้องการรับรหัสคำเตือนของคำเตือนให้ไปที่ Report Navigator (Command + 9) เลือกบิลด์บนสุดขยายบันทึก (ปุ่ม '=' ทางด้านขวา) และเลื่อนไปที่ ด้านล่างและมีรหัสคำเตือนของคุณอยู่ในวงเล็บเหลี่ยมเช่นนี้[-Wshadow-ivar]

สำหรับเสียงดังคุณสามารถใช้

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

4
Clang รองรับ pragma ของ GCC สำหรับความเข้ากันได้กับซอร์สโค้ดที่มีอยู่ ดังนั้นคุณต้องเขียน pragma รูปแบบ gcc
Allen

1
เริ่มต้นด้วย Xcode 5.0 Clang เป็นคอมไพเลอร์เดียวที่มีให้ ดังนั้นคุณสามารถใช้ pragma รูปแบบเสียงดังได้ทันที
allenlinli

27

ในการลบคำเตือนสำหรับแต่ละไฟล์ให้ทำดังต่อไปนี้:

เลือกไฟล์ในโครงการ xcode กดรับข้อมูลไปที่หน้าพร้อมตัวเลือกการสร้างป้อน -Wno- เพื่อลบคำเตือน:

-Wno-

เช่น

-Wno-ที่ไม่ได้ใช้พารามิเตอร์

คุณจะได้รับชื่อของคำเตือนหากคุณดูการตั้งค่าโปรเจ็กต์ดูคำเตือน GCC ที่อยู่ด้านล่างของหน้าแท็บบิลด์โดยคลิกที่คำเตือนแต่ละรายการระบบจะบอกชื่อพารามิเตอร์คำเตือน:

เช่น

เตือนเมื่อใดก็ตามที่ไม่มีการใช้พารามิเตอร์ฟังก์ชันนอกเหนือจากการประกาศ [GCC_WARN_UNUSED_PARAMETER, -Wunused-parameter]


2
นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมเมื่อคุณรวมโค้ดจาก codebase ที่คุณไม่ต้องการแก้ไขซึ่งจะเกิดขึ้นกับคำเตือนของคอมไพเลอร์ทริกเกอร์ ...
Mark Beaton

ดูเหมือนจะเป็นวิธีที่ดี แต่มีแนวคิดอย่างไรใน XCode 4
Santthosh

2
พบวิธีแก้ปัญหาของฉันที่นี่สำหรับ XCode 4 stackoverflow.com/questions/6057192/…
Santthosh

หากคุณต้องการคำเตือน supress สำหรับปัญหาเดียวเช่นของ...m:45:69: Incompatible pointer types sending...ฉันฉันเปิดคำอธิบายการสร้างและพบคำเตือนนี้[-Wincompatible-pointer-types]ฉันเพิ่งเปลี่ยนชื่อเป็น-Wno-incompatible-pointer-typesและเพิ่มเป็นแฟล็กใน.mไฟล์ของฉัน... ไม่มีคำเตือนอีกต่อไป ... +10 ถ้า ฉันทำได้
Nicos Karalis

5

ด้วย Objective-C ข้อผิดพลาดร้ายแรงจำนวนหนึ่งจะปรากฏเป็นคำเตือนเท่านั้น ฉันไม่เพียง แต่ไม่ปิดใช้งานคำเตือน แต่โดยปกติฉันจะเปิด "ถือว่าคำเตือนเป็นข้อผิดพลาด" (- ข้อผิดพลาด)

คำเตือนทุกประเภทในรหัสของคุณสามารถหลีกเลี่ยงได้โดยทำสิ่งต่างๆให้ถูกต้อง (โดยปกติโดยการหล่อวัตถุให้เป็นประเภทที่ถูกต้อง) หรือโดยการประกาศต้นแบบเมื่อคุณต้องการ


14
แม้ว่านี่จะเป็นคำแนะนำทั่วไปที่ดี แต่ก็ไม่ได้ตอบคำถาม คำเตือนทั้งหมดไม่สำคัญหรือร้ายแรง หลายคนเป็นเรื่องเล็กน้อย สมมติว่าจำเป็นต้องใช้ไลบรารีของบุคคลที่สามและไม่สามารถแก้ไขได้ไม่ว่าจะด้วยเหตุผลใดก็ตาม (โค้ดเบสแบบเดิมรหัสที่หมายถึงการเชื่อมโยงโดยบุคคลที่สามการกำหนดเงื่อนไขของหัวหน้า ฯลฯ ) การระงับคำเตือนเล็กน้อยที่เฉพาะเจาะจงเป็นสิ่งที่ยอมรับได้ในกรณีเหล่านี้
Paul Legato

5

หากต้องการกำจัดคำเตือน: ลองสร้างอินเทอร์เฟซหมวดหมู่สำหรับวัตถุที่เป็นปัญหา

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

นอกจากนี้ฉันไม่แนะนำอย่างยิ่งให้เรียกวิธีการที่ไม่มีเอกสารในรหัสการจัดส่ง อินเทอร์เฟซสามารถและจะเปลี่ยนแปลงได้และจะเป็นความผิดของคุณ


ฉันก็ทำเช่นนี้เช่นกัน ฉันเรียกหมวดหมู่ของฉันว่า "ส่วนตัว" และวางไว้ที่ด้านบนของไฟล์. m ... มันทำหน้าที่เป็นวิธีในการส่งต่อประกาศวิธีการที่ใช้เฉพาะในไฟล์เท่านั้น ฉันยอมรับว่าไฟล์ส่วนหัวส่วนตัวจะเป็นมาตรฐานมากกว่า แต่การต้องเด้งระหว่างไฟล์อย่างต่อเนื่องเพื่อสิ่งที่ควรมีอยู่ทั้งหมด (ส่วนตัว) ไปยังการใช้งานนั้นน่ารำคาญ
Pat Niemeyer

ดังนั้นปรากฎว่าคุณสามารถใช้เคล็ดลับ C แบบเก่าในการใช้วิธีการก่อนที่จะใช้มัน จากนั้นคุณก็มีวิธีการภายในไฟล์ด้วยตัวคุณเอง ฉันคิดว่ามันไม่เป็นส่วนตัวดังนั้นไฟล์อื่น ๆ อาจส่งข้อความไปยังตัวเลือกที่คุณกำหนดด้วยวิธีนี้
Mark Pauley


3

สร้างไฟล์ส่วนหัวใหม่แยกต่างหากชื่อ 'Undocumented.h' และเพิ่มลงในโปรเจ็กต์ของคุณ จากนั้นสร้างหนึ่งบล็อกอินเตอร์เฟสสำหรับแต่ละคลาสที่คุณต้องการเรียกใช้ฟังก์ชันที่ไม่มีเอกสารและกำหนดประเภทของ '(ไม่มีเอกสาร)' จากนั้นรวมไฟล์ส่วนหัวหนึ่งไฟล์ไว้ใน PCH ของคุณ ด้วยวิธีนี้ไฟล์ส่วนหัวเดิมของคุณจะยังคงสะอาดมีไฟล์อื่นเพียงไฟล์เดียวที่ต้องดูแลและคุณสามารถแสดงความคิดเห็นหนึ่งบรรทัดใน PCH ของคุณเพื่อเปิดใช้งานคำเตือนทั้งหมดอีกครั้ง

ฉันยังใช้วิธีนี้สำหรับฟังก์ชันที่คิดค่าเสื่อมราคาใน 'Depreciated.h' ด้วยหมวดหมู่ '(Depreciated)'

ส่วนที่ดีที่สุดคือคุณสามารถเลือกเปิด / ปิดคำเตือนแต่ละรายการได้โดยการแสดงความคิดเห็นหรือยกเลิกการแสดงความคิดเห็นของแต่ละต้นแบบ


1

การระงับคำเตือนนั้นไม่ปลอดภัย คอมไพเลอร์จำเป็นต้องทราบประเภทของอาร์กิวเมนต์และส่งกลับไปยังเมธอดเพื่อสร้างโค้ดที่ถูกต้อง

ตัวอย่างเช่นหากคุณกำลังเรียกใช้เมธอดเช่นนี้

[foo doSomethingWithFloat: 1.0];

ที่ใช้เวลาลอยและไม่มีต้นแบบปรากฏให้เห็นจากนั้นคอมไพเลอร์จะเดาว่าวิธีนี้ใช้เวลาสองเท่าไม่ใช่การลอย ซึ่งอาจทำให้เกิดข้อขัดข้องและตีความค่าไม่ถูกต้อง ในตัวอย่างข้างต้นบนเครื่อง endian ตัวเล็ก ๆ เช่นเครื่อง intel เมธอดตัวรับจะเห็น 0 ผ่านไม่ใช่ 1

คุณสามารถอ่านสาเหตุในเอกสาร i386 ABIหรือเพียงแค่แก้ไขคำเตือนของคุณ :-)


2
คำแนะนำที่ดี แต่ไม่ได้ตอบคำถามจริงๆตามข้างบน
Paul Legato
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.