Supposons que nous ayons le code suivant:Forcer GCC 4.x à traiter le type -Wreturn comme une erreur sans activer -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;
}
Et supposons qu'il devait être compilé le compilateur C++ (et non le compilateur C) de la version GCC 4.2.1 avec les options -Wreturn-type -Werror=return-type
. Si le code ci-dessus est compilé comme est sans décommentant la ligne //#define USE_CXX_CLASS
ci-dessus, vous verrez un avertissement mais aucune erreur:
.../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
Mais si la ligne //#define USE_CXX_CLASS
est décommentée, l'avertissement est TRAITÉS comme une erreur:
.../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
Oui, l'un est une fonction non-membre (cas n ° 2), et l'autre est une fonction C++ (cas n ° 1). OMI, cela ne devrait pas importer. Je veux les deux conditions traitées comme une erreur, et je ne veux pas ajouter -Werror
ou -Wall
à ce moment (probablement le fera plus tard, mais c'est hors de portée de cette question).
Mes sous-questions sont les suivantes:
- Est-il un commutateur de GCC que je manque qui devrait fonctionner? (Non, je ne veux pas utiliser
#pragma
.) - Est-ce un bug qui a été corrigé dans une version plus récente de GCC?
Pour référence, j'ai déjà versé par d'autres questions similaires déjà, notamment les suivantes:
- 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?
Question très écrite. – GManNickG
avez-vous trouvé une solution à ce @bgoodr –
Pas encore. Il se peut que ce soit un bogue corrigé dans les versions plus récentes du compilateur, mais comme je n'ai pas l'option de mettre à jour le compilateur à ce moment-là, je vais juste attendre jusqu'à ce que nous le fassions. – bgoodr