Supponiamo di avere il seguente codice:Forzare GCC 4.x per trattare -Wreturn-type come errore senza abilitazione -Werror?
#if !defined(__cplusplus)
# error This file should be compiled as C++
#endif
#include <stdio.h>
#include <string>
//#define USE_CXX_CLASS
#ifdef USE_CXX_CLASS
class SomeClass
{
public:
SomeClass() {}
~SomeClass() {}
std::string GetSomeString()
{
// case #1
}
};
#endif // USE_CXX_CLASS
int foo()
{
// case #2
}
int
main (int argc, char *argv[])
{
(void)argc;
(void)argv;
#ifdef USE_CXX_CLASS
SomeClass someInstance;
someInstance.GetSomeString();
#endif // USE_CXX_CLASS
foo();
return 0;
}
E supponiamo che dovesse essere compilato il compilatore C++ (e non il compilatore C) dal GCC versione 4.2.1 con le opzioni -Wreturn-type -Werror=return-type
. Se il codice di cui sopra è compilato come è senza prima commentando la linea di //#define USE_CXX_CLASS
sopra, poi si vedrà un avviso ma nessun errore:
.../gcc-4.2.1/bin/g++ -g -fPIC -Wreturn-type -Werror=return-type test.cpp -c -o test.o
test.cpp: In function 'int foo()':
test.cpp:26: warning: control reaches end of non-void function
Ma se la linea //#define USE_CXX_CLASS
sia commentata, quindi l'avviso è animali trattati come un errore:
.../gcc-4.2.1/bin/g++ -g -fPIC -Wreturn-type -Werror=return-type test.cpp -c -o test.o
test.cpp: In member function 'std::string SomeClass::GetSomeString()':
test.cpp:18: error: no return statement in function returning non-void [-Wreturn-type]
gmake: *** [test.o] Error 1
Sì, uno è una funzione non-membro (caso # 2), e l'altro è una funzione C++ (caso # 1). IMO, quello non dovrebbe importare. Voglio entrambe le condizioni trattate come un errore, e non voglio aggiungere -Werror
o -Wall
a questo punto nel tempo (probabilmente lo farò più tardi, ma è fuori dallo scopo di questa domanda).
miei sotto-domande sono:
- C'è qualche interruttore GCC che mi manca che dovrebbe funzionare? (No, non voglio usare
#pragma
.) - Si tratta di un bug che è stato risolto in una versione più recente di GCC?
Per avere un riferimento, ho già versato attraverso altre domande simili già, tra cui le seguenti:
- Why does flowing off the end of a non-void function without returning a value not produce a compiler error?
- C question: no warning?
- Is a return statement mandatory for C++ functions that do not return void?
Domanda molto scritta. – GManNickG
hai trovato una soluzione a questo @bgoodr –
Non ancora. Potrebbe essere il caso che questo è in realtà un bug corretto nelle versioni più recenti del compilatore, ma poiché non ho un'opzione per aggiornare il compilatore a questo punto nel tempo, ho intenzione di aspettare fino a che non lo facciamo. – bgoodr