Viết một đánh giá đơn giản tôi đã gặp một vấn đề buồn cười.sau khi xác định trường hợp cho tất cả các giá trị enum, trình biên dịch vẫn nói: "kiểm soát đạt đến kết thúc của chức năng không void"
Với mã:
enum node_type {LEAF, NODE};
struct tree_elm_t {
enum node_type type;
union {
struct tree_node_t node;
struct tree_leaf_t leaf;
} datum;
};
int parse_leaf(struct tree_leaf_t leaf);
int parse_node(struct tree_node_t node);
int parse_tree(struct tree_elm_t* tree);
....
int parse_tree(struct tree_elm_t* tree) {
switch(tree->type) {
case NODE: return parse_node(tree->datum.node);
case LEAF: return parse_leaf(tree->datum.leaf);
}
}
Tôi đã ngạc nhiên khi thấy gcc được phàn nàn về một lựa chọn dòng điều khiển mất tích:
example.c: In function 'parse_tree':
example.c:54: warning: control reaches end of non-void function
vấn đề lưu lượng có thể được giải quyết bằng cách lưu trữ các giá trị trả về, trong một biến số như vậy:
int parse_tree(struct tree_elm_t* tree) {
int sum;
switch(tree->type) {
case NODE: sum = parse_node(tree->datum.node); break;
case LEAF: sum = parse_leaf(tree->datum.leaf); break;
}
return sum;
}
Tuy nhiên, tôi tìm thấy bộ dọn sạch mã gốc là có cách để làm cho gcc chấp nhận mã gốc - (Tôi muốn phân tích tĩnh để nhận ra rằng mã của tôi là hợp lệ và sạch sẽ).
EDIT:
tôi có thể có được một chút không rõ ràng.
phép nói rằng tôi biên dịch đoạn mã sau:
int parse_tree(struct tree_elm_t* tree) {
int sum;
switch(tree->type) {
case NODE: sum = parse_node(tree->datum.node); break;
// case LEAF: sum = parse_leaf(tree->datum.leaf); break;
}
return sum;
}
gcc sẽ cho tôi một lời cảnh báo:
example.c: In function 'parse_tree':
example.c:51: warning: enumeration value 'LEAF' not handled in switch
nghĩa là gcc có một cảm giác trong những lựa chọn cho các giá trị trong việc chuyển đổi, và thực tế là tôi đã nhận xét trường hợp của LEAF. Điều này sẽ ngụ ý rằng gcc cũng biết rằng khi đi qua việc chuyển đổi mọi trường hợp đang được kiểm tra. vậy tại sao tuyên bố:
control reaches end of non-void function
là thiếu hệ thống phân tích tĩnh trong gcc - hoặc tính năng ngôn ngữ?
Bạn đã cân nhắc trả lại '0' chưa? –
Bạn đã thử thêm câu lệnh "mặc định" vào chuyển đổi trả về một số giá trị lỗi, có lẽ ném một ngoại lệ nếu đây thực sự là một trường hợp không nên xảy ra? – ChrisCM
Tại sao làm cho nó trở lại 'int' nếu đó không phải là ý định của bạn ở nơi đầu tiên chứ không phải là' void'? –