Pertimbangkan pernyataan enum dan switch berikut:
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
}
};
Saya seorang programmer Objective-C, tetapi saya telah menulis ini dalam C murni untuk audiens yang lebih luas.
Dentang / LLVM 4.1 dengan -Weverything memperingatkan saya di baris default:
Label default dalam sakelar yang mencakup semua nilai enumerasi
Sekarang, saya bisa melihat mengapa ini ada: di dunia yang sempurna, satu-satunya nilai yang masuk dalam argumen theMask
akan berada di enum, jadi tidak ada standar yang diperlukan. Tetapi bagaimana jika beberapa hack datang dan melempar int yang tidak diinisialisasi ke dalam fungsi saya yang cantik? Fungsi saya akan disediakan sebagai setetes di perpustakaan, dan saya tidak punya kendali atas apa yang bisa masuk ke sana. Menggunakan default
adalah cara penanganan yang sangat rapi.
Mengapa para dewa LLVM menganggap perilaku ini tidak layak bagi perangkat infernal mereka? Haruskah saya mendahului ini dengan pernyataan if untuk memeriksa argumen?
-Weverything
bisa bermanfaat, tetapi hati-hati tentang mengubah kode Anda terlalu banyak untuk menghadapinya. Beberapa dari peringatan itu tidak hanya tidak berharga tetapi juga kontra-produktif, dan sebaiknya dimatikan. (Memang, itulah use case untuk -Weverything
: mulai dengan itu, dan matikan apa yang tidak masuk akal.)
"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."
.