Quando compilo il seguente codice allo standard C++ 11, funziona bene con clang, e anche con gcc, ma gcc (tutte le versioni che ho testato 4.8.2, 4.9.2, 5.1.0) danno un avvertimento:gcc: come gestire al meglio gli avvisi relativi alla fine della funzione (irraggiungibile) dopo l'interruttore?
#include <iostream>
enum class FOO { A, B, C };
const char * bar(FOO f) {
switch (f) {
case FOO::A:
return "A";
case FOO::B:
return "B";
case FOO::C:
return "C";
}
}
int main() {
unsigned int x;
std::cin >> x;
FOO f = static_cast<FOO>(x % 3);
std::cout << bar(f) << std::endl;
}
l'avvertimento è -Wreturn-type
:
main.cpp: In function ‘const char* bar(FOO)’:
main.cpp:14:1: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1plus: all warnings being treated as errors
ho ancora ottenere l'avvertimento anche con -O2
o -O3
ottimizzazioni - questo significa che anche ad alti livelli di ottimizzazione, gcc non può dead-code eliminare il ' fine 'della funzione?
In particolare, non mi dà l'avviso su casi di interruttori non gestiti.
Modifica: dagli esperimenti con Godbolt, sembra che anche a livelli elevati, non elimina il codice. Non sono sicuro che sia o se clang fa per esempio.
C'è un buon modo per sopprimere localmente questo avviso all'interno di tale funzione, o è l'unico modo per sopprimerlo per disabilitare l'avviso in generale?
Edit: Credo che la questione presenta un linguaggio naturale domanda avvocato, a giudicare dalle risposte:
Può un compilatore conforme morto codice di eliminare la "fine" della funzione
bar
la proposta? (Oppure la versione 101010 conreturn nullptr;
è stata aggiunta?) O conforme allo standard richiede che generi codice per gestire i valori enum che non fanno parte della definizione enum?
La mia convinzione era che il codice potrebbe eliminarlo, ma è il caso di dimostrarmi in errore.
Il problema è che 'bar' è dichiarato per restituire un' char * 'ma non nel caso' default'. – Kenney
Ne sei così sicuro? Lo standard in particolare consente di non restituire nulla da main. Aggiungendo 'return 0;' alla fine non si ferma l'avvertimento, e l'avvertimento si riferisce comunque alla funzione 'bar' in ogni caso. –
Hai ragione, mi dispiace, è solo la funzione della barra. – Kenney