Pisanie prostej oceny Natknąłem się na zabawny problem.po zdefiniowaniu wielkości liter dla wszystkich wartości wyliczeniowych, kompilator wciąż mówi: "kontrola osiąga koniec funkcji bez funkcji"
względu na kod:
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);
}
}
Byłem zaskoczony, aby zobaczyć, że gcc narzeka brakującej opcji przepływu sterowania:
example.c: In function 'parse_tree':
example.c:54: warning: control reaches end of non-void function
problem przepływu może być rozwiązane poprzez przechowywanie wartości zwracanej, w zmiennej takiej jak:
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;
}
Mam jednak znaleźć oryginalny kod dużo czystsze, jest istnieje sposób na to, aby gcc zaakceptował oryginalny kod - (chcę przeprowadzić analizę statyczną, aby zdać sobie sprawę, że mój kod jest prawidłowy i czysty).
EDIT:
mogę być nieco niejasna.
powiedzmy skompilować następujący kod:
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 da mi ostrzeżenie:
example.c: In function 'parse_tree':
example.c:51: warning: enumeration value 'LEAF' not handled in switch
co oznacza, że gcc ma poczucie opcji dla wartości w przełączniku, a fakt, że ja skomentowałem sprawę LEAF. Oznaczałoby to, że gcc wie również, że podczas przechodzenia przez przełącznik, każdy przypadek jest badany. dlaczego więc stwierdzenie:
czy brakuje w nim brakującego systemu analizy statycznej w gcc - czy funkcji języka?
Czy rozważałeś powrót '0'? –
Czy próbowałeś dodać do przełącznika "domyślną" instrukcję, która zwraca pewną wartość błędu, być może zgłasza wyjątek, jeśli jest to rzeczywiście okoliczność, która nie powinna mieć miejsca? – ChrisCM
Dlaczego sprawić, by zwracano 'int', jeśli to nie jest twoja intencja, a nie' void'? –