Розглянемо наступне твердження enum and 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, але це я написав у чистому С для широкої аудиторії.
Clang / LLVM 4.1 з -Weverything попереджає мене у рядку за замовчуванням:
Мітка за замовчуванням у перемикачі, яка охоплює всі значення перерахування
Тепер я можу розібратися, чому це саме так: в ідеальному світі єдині значення, що вводяться в аргумент, theMask
були б у перерахунку, тому за замовчуванням не потрібно. Але що робити, якщо якийсь хак прийде разом і кине неініціалізований інт у мою прекрасну функцію? Моя функція буде забезпечуватися як падіння бібліотеки, і я не маю ніякого контролю над тим, що могло б туди потрапити. Використання default
- це дуже акуратний спосіб вирішення цього питання.
Чому боги LLVM вважають цю поведінку недостойною свого пекельного пристрою? Чи повинен я передувати цьому твердженням 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."
.