พิจารณาคำสั่ง enum และ switch ต่อไปนี้:
typedef enum {
MaskValueUno,
MaskValueDos
} testingMask;
void myFunction(testingMask theMask) {
switch (theMask) {
case MaskValueUno: {}// deal with it
case MaskValueDos: {}// deal with it
default: {} //deal with an unexpected or uninitialized value
}
};
ฉันเป็นโปรแกรมเมอร์ Objective-C แต่ฉันเขียนสิ่งนี้ใน C บริสุทธิ์สำหรับผู้ชมที่กว้างขึ้น
Clang / LLVM 4.1 ด้วย - ทุกอย่างเตือนฉันที่บรรทัดเริ่มต้น:
ฉลากเริ่มต้นในสวิตช์ซึ่งครอบคลุมค่าการแจงนับทั้งหมด
ทีนี้ฉันสามารถดูว่าทำไมถึงมีอยู่: ในโลกที่สมบูรณ์แบบค่าเดียวที่เข้าสู่การโต้แย้งtheMask
จะอยู่ใน enum ดังนั้นจึงไม่จำเป็นต้องมีค่าเริ่มต้น แต่จะเกิดอะไรขึ้นถ้าแฮ็กบางตัวเข้ามาและส่ง int ที่ไม่ได้กำหนดค่าเริ่มต้นไปยังฟังก์ชันที่สวยงาม ฟังก์ชั่นของฉันจะได้รับการจัดวางไว้ในห้องสมุดและฉันไม่สามารถควบคุมสิ่งที่จะเข้าไปได้ การใช้default
เป็นวิธีการจัดการที่เป็นระเบียบ
ทำไม LLVM gods จึงเห็นว่าพฤติกรรมนี้ไม่คู่ควรกับอุปกรณ์ที่ไม่ดีของพวกมัน? ฉันควรจะนำหน้าด้วยคำสั่ง if เพื่อตรวจสอบการโต้แย้ง?
-Weverything
อาจมีประโยชน์ แต่ควรระวังเกี่ยวกับการกลายพันธุ์รหัสของคุณมากเกินไปที่จะจัดการกับมัน คำเตือนบางอย่างนั้นไม่เพียง แต่ไร้ค่าเท่านั้น (อันที่จริงมันเป็นกรณีการใช้งานสำหรับ-Weverything
: เริ่มต้นด้วยและปิดสิ่งที่ไม่สมเหตุสมผล)
"Pro tip: Try setting the -Weverything flag and checking the “Treat Warnings as Errors” box your build settings. This turns on Hard Mode in Xcode."
: