2010-11-18 11 views
5

Angenommen, wir haben den folgenden Code:Erzwingen GCC 4.x zu behandeln -Wreturn-Typ als Fehler ohne zu aktivieren -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; 
} 

Und angenommen, dass es die C++ Compiler (und nicht die C-Compiler) von GCC-Version 4.2.1 mit den Optionen -Wreturn-type -Werror=return-type zusammengestellt werden sollte. Wenn der obige Code kompiliert wird, wie ohne tiere zuerst die //#define USE_CXX_CLASS Linie oben ist, dann sehen Sie eine Warnung aber keinen Fehler:

.../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 

Aber wenn die //#define USE_CXX_CLASS Linie unkommentiert ist, dann die Warnung behandeltem als Fehler:

.../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 

Ja, ist ein nicht-Mitgliedsfunktion (Fall # 2), und die andere ist eine C++ Funktion (Fall # 1). IMO, das sollte nicht wichtig sein. Ich möchte, dass beide Bedingungen als ein Fehler behandelt werden, und ich möchte -Werror oder -Wall zu diesem Zeitpunkt nicht hinzufügen (wird wahrscheinlich später tun, aber das ist außerhalb des Bereichs dieser Frage).

Meine Unterfragen sind:

  1. Gibt es einen GCC-Schalter, dass ich fehle das funktionieren soll? (Nein, ich möchte nicht #pragma verwenden.)
  2. Ist das ein Fehler, der in einer neueren Version von GCC behandelt wurde?

Als Referenz habe ich gegossen bereits durch andere ähnliche Fragen bereits, darunter die folgenden:

+0

Stark geschriebene Frage. – GManNickG

+0

hast du eine Lösung gefunden @bgoodr –

+0

Noch nicht. Es könnte sein, dass dies tatsächlich ein Fehler ist, der in neueren Releases des Compilers behoben wurde, aber da ich zu diesem Zeitpunkt keine Option habe, den Compiler zu aktualisieren, werde ich einfach warten, bis wir es tun. – bgoodr

Antwort

0

Es scheint mir, dass das, was Sie brauchen einen Shell-Skript-Wrapper um gcc.

  • Namen es so etwas wie gcc-wrapper und g++-wrapper.
  • In Ihrem Makefile-Set CC und CXX zu den Wrappern.
  • Lassen Sie den Wrapper GCC aufrufen und leiten Sie die Ausgabe an ein anderes Programm weiter, das nach den gewünschten Warnzeichenfolgen sucht.
  • Lassen Sie das Suchprogramm mit einem Fehler enden, wenn die Warnung gefunden wird.
+0

Danke Zan. Eigentlich habe ich hauptsächlich nach einer Antwort auf die Unterfrage # 1 gesucht.Ich möchte mich nicht damit beschäftigen, Wrapper herumzutragen, um zu hacken, was GCC meiner Meinung nach unterstützen sollte. Ich fange an zu schließen, dass dies ein Fehler (oder ein fehlendes Feature) in GCC selbst ist. – bgoodr

1

Ich sehe einen Fehler auch ohne das USE_CXX_CLASS Flag. h., g ++ ist konsistent mit dem Fehler sowohl für Klassenmitgliedsfunktionen als auch für Nichtmitgliedsfunktionen. g ++ (GCC) 4.4.3 20100127 (Red Hat 4.4.3-4)