ฉันจะกำจัดคำเตือน "ตัวแปรที่ไม่ได้ใช้" ใน Xcode ได้อย่างไร


98

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

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

Xcode รายงานว่าsavedเป็นตัวแปรที่ไม่ได้ใช้งานซึ่งแน่นอนว่าไม่ใช่ตัวแปร ฉันสงสัยว่านี่เป็นเพราะNSAssert1มาโคร NS_BLOCK_ASSERTIONSมาโครไม่ได้กำหนดไว้เพื่อวัตถุประสงค์ยืนยัน C มีการใช้งานแน่นอน

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

คำตอบ:


108

ฉันไม่แน่ใจว่ายังรองรับในคอมไพเลอร์ LLVM ใหม่หรือไม่ แต่ GCC มีแอตทริบิวต์ "ไม่ได้ใช้" ที่คุณสามารถใช้เพื่อระงับคำเตือนนั้นได้:

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

อีกทางเลือกหนึ่ง (ในกรณีที่ LLVM ไม่รองรับข้างต้น) คุณสามารถแยกการประกาศตัวแปรออกเป็นบรรทัดแยกกันโดยรับประกันว่าตัวแปรจะถูก "ใช้" ไม่ว่ามาโครจะขยายหรือไม่:

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

107

ใช้ Xcode 4.3.2 และพบว่าสิ่งนี้ดูเหมือนจะใช้งานได้ (เขียนน้อยลง)

BOOL saved __unused;

สิ่งนี้ไม่ได้ผลสำหรับฉันฉันได้รับคำเตือนว่า'saved' was marked as unused but was used
Heath Borders

37

ใน Xcode คุณสามารถตั้งค่าคำเตือนสำหรับ "ตัวแปรที่ไม่ได้ใช้" ไปที่ "Build Settings" สำหรับเป้าหมายและกรองด้วยคำว่า "unused"

นี่คือภาพหน้าจอ: ภาพหน้าจอการตั้งค่า Builld

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


37
คุณพลาดส่วนหนึ่งของคำถามที่ Gregory กล่าวว่า "ฉันไม่ต้องการปราบปรามพวกเขาโดยทั่วไปเพราะส่วนใหญ่มีประโยชน์อย่างเหลือเชื่อ" หรือไม่
Sherm Pendley

8
@ShermPendley ไม่ว่าสิ่งนี้จะมีประโยชน์ แต่ก็ตอบคำถามของฉันเกี่ยวกับวิธีปิดใช้งานทั่วโลก
raffian

9
การปิดคำเตือนเป็นวิธีที่ดีในการพลาดจุดบกพร่อง ฉันขอแนะนำให้ต่อต้าน
orion elenzil

2
@orionelenzil - ใช่และไม่ใช่ มีปัญหาอินเทอร์เฟซจริงกับผลบวกปลอม คำเตือนจะปรากฏขึ้นตลอดเวลาในขณะที่คุณกำลังเขียนโค้ดหากคุณไม่ได้เข้าไปในส่วนของโค้ดที่คุณใช้ตัวแปร เมื่อเวลาผ่านไปสิ่งนี้จะฝึกให้คุณเพิกเฉยต่อคำเตือนซึ่งหมายความว่าคุณอาจพลาดข้อผิดพลาดที่สำคัญกว่านั้น มันจะดีกว่าที่จะสามารถระงับข้อผิดพลาดในบล็อกของโค้ดที่กำลังแก้ไขอยู่
TechZen

สวัสดีมันทำงานได้ดีถ้าฉันตั้งค่าเป็น NO แต่ข้อสงสัยของฉันคือฉันต้องตั้งค่า Debug & Release NO เฉพาะ Unused Variable: NO? ต้องตั้งค่าไหน ถ้าฉันตั้งค่า Totally NO มันจะไม่สร้างพร็อบใด ๆ ระหว่างรีลีส na?
Soumya Ranjan

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

ลองแบบนี้ดูสิ มันทำงานให้ฉัน มันจะได้ผลสำหรับคุณเช่นกัน


สิ่งนี้ไม่ได้ผลสำหรับฉันฉันได้รับคำเตือนว่า'saved' was marked as unused but was used
Heath Borders

15

วิธีเดียวที่ง่ายและพกพาสะดวกในการทำเครื่องหมายตัวแปรว่าใช้คือ…ใช้มัน

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

คุณอาจพอใจกับส่วนขยายเฉพาะของคอมไพเลอร์ที่อธิบายไว้แล้ว


2
ฉันชอบสิ่งนี้มากกว่า #pragma ที่น่าเกลียดที่อธิบายไว้ข้างต้น
เหนือ

1
สวัสดีครับคำแนะนำที่ดี
dimazava




4

นี่คือวิธีที่คุณทำใน C และด้วย Objective-C

แม้ว่าคุณจะไม่ได้เปิดใช้งานคำเตือน แต่คุณควรทำเครื่องหมายค่าที่ส่งคืนว่าละเว้นอย่างชัดเจนเสมอ นอกจากนี้ยังแสดงให้นักพัฒนาคนอื่น ๆ เห็นด้วยว่าคุณไม่ได้ลืมเพียงแค่เกี่ยวกับมูลค่าที่ส่งคืนคุณได้เลือกที่จะเพิกเฉย

(void)[moc save:&error];

แก้ไข: คอมไพเลอร์เพิกเฉยต่อการร่ายvoidดังนั้นจึงไม่ควรส่งผลกระทบต่อประสิทธิภาพ - มันเป็นเพียงคำอธิบายประกอบของมนุษย์ที่ดี


ในบางบริบทคุณต้องใช้แฮ็คนี้เพื่อรับโค้ด Objective-C เพื่อคอมไพล์ การใช้(void)เป็นวิธีที่ชัดเจนที่สุดขอบคุณ!
Dan Rosenstark

1

ใช้เวลาสองบรรทัด แยกการประกาศและค่าเริ่มต้น

BOOL enabled = NO;

// ...

BOOL enabled;

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