Giả sử tôi có một điều tra.Điều gì được đặt trong nhãn mặc định của nút chuyển?
enum class ShapeName : char {TRIANGLE,CIRCLE,SQUARE};
và sau đó tôi có một chức năng như thế này:
void Function (ShapeName const shape){
switch (shape){
case ShapeName::TRIANGLE:
DoSomething1();
break;
case ShapeName::CIRCLE:
DoSomething2();
break;
case ShapeName::SQUARE:
DoSomething3();
break;
default:
//THIS CODE BLOCK SHOULD NEVER BE EXECUTED!
}
return;
}
Mặc dù nhãn mặc định không bao giờ được thực hiện, tôi muốn giải thích cho các lỗi tiềm tàng có thể xảy ra nếu một lập trình viên cho biết thêm một giá trị để 'ShapeName' và nó không được tính trong chuyển đổi.
Bạn nên làm gì?
1. Khẳng định
tôi có thể sử dụng một sự khẳng định, nhưng những gì tôi khẳng định?
assert(false); //?
2. Trường hợp ngoại lệ
tôi có thể ném một ngoại lệ, nhưng tôi không nghĩ rằng sẽ được thực hành rất tốt. Tôi có ấn tượng rằng các trường hợp ngoại lệ dành cho các sự kiện thời gian chạy không thể dự đoán được do một số môi trường nhất định.
3. Thoát
Tôi chỉ có thể thoát khỏi chương trình ngay lập tức với một lỗi. Điều đó giống như ý tưởng hay nhất, nhưng tôi không chắc liệu đó có phải là thực hành tốt hay không. Tôi nghĩ rằng lợi thế của các xác nhận là bạn có thể tắt tất cả khi bạn đã sẵn sàng tàu chương trình. Sau đó, tất cả mã xác nhận đó sẽ không còn tồn tại nữa.
Có thể có một cách khác mà tôi không biết. Tôi sử dụng một lá cờ trình biên dịch cảnh báo về không có giá trị cho các giá trị, nhưng tôi vẫn muốn biết những gì người khác đề nghị.
4. Bạn có thể yêu cầu trình biên dịch cảnh báo không? Đó là một lựa chọn mà tôi mong đợi cho các enums kiểu cũ. –
@SteveJessop g ++ -w -Wall -Wextra -Wswitch -Wswitch-default -Wswitch-enum -std = C++ 0x-main main.cpp lạ, tôi không nhận được cảnh báo nào cả với mã ở trên. Tôi đã thêm một ShapeName khác và đã loại bỏ nhãn mặc định. Vẫn không có gì! –
Chuột. Mặc dù vậy, việc thực hiện C++ 11 chưa hoàn tất, vì vậy chúng ta có thể sống với hy vọng. –