Hãy xem xét enum và câu lệnh switch sau đây:
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
}
};
Tôi là một lập trình viên Objective-C, nhưng tôi đã viết nó bằng C thuần túy cho nhiều đối tượng hơn.
Clang / LLVM 4.1 với -Weverything cảnh báo tôi ở dòng mặc định:
Nhãn mặc định trong switch bao gồm tất cả các giá trị liệt kê
Bây giờ, tôi có thể sắp xếp xem tại sao nó lại ở đó: trong một thế giới hoàn hảo, các giá trị duy nhất nhập vào đối số theMask
sẽ nằm trong enum, vì vậy không cần mặc định là cần thiết. Nhưng chuyện gì sẽ xảy ra nếu một số hack xuất hiện và ném một int chưa được khởi tạo vào chức năng tuyệt đẹp của tôi? Chức năng của tôi sẽ được cung cấp dưới dạng thư viện và tôi không kiểm soát được những gì có thể xảy ra ở đó. Sử dụng default
là một cách rất gọn gàng để xử lý này.
Tại sao các vị thần LLVM coi hành vi này không xứng đáng với thiết bị vô sinh của họ? Tôi có nên đi trước điều này bằng một câu lệnh if để kiểm tra đối số không?
-Weverything
có thể hữu ích, nhưng hãy cẩn thận về việc làm thay đổi mã của bạn quá nhiều để xử lý nó. Một số trong những cảnh báo đó không chỉ vô giá trị mà còn phản tác dụng, và tốt nhất là tắt đi. (Thật vậy, đó là trường hợp sử dụng cho -Weverything
: bắt đầu với nó và tắt những gì không có ý nghĩa.)
"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."
.