2010-11-18 14 views
5

Załóżmy, że mamy następujący kod:Wymuszenie przetwarzania GCC 4.x - Zwrotny typ jako błąd bez włączania -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; 
} 

I przypuszczać, że miały być kompilowane ++ kompilator C (a nie kompilator C) od wersji 4.2.1 GCC z opcjami -Wreturn-type -Werror=return-type. Jeżeli powyższy kod jest kompilowany jak bez uprzedniego odkomentowanie linię //#define USE_CXX_CLASS powyżej, a następnie pojawi się ostrzeżenie ale nie błąd:

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

Ale jeśli linia //#define USE_CXX_CLASS jest komentarzem, to ostrzeżenie jest leczonej jako błąd:

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

Tak, jeden jest funkcją non-member (przypadek nr 2), a drugi jest funkcja C++ (przypadek nr 1). IMO, to nie powinno mieć znaczenia. Chcę, aby oba warunki zostały potraktowane jako błąd i nie chcę dodawać w tym momencie -Werror lub -Wall (prawdopodobnie zrobię to później, ale to wykracza poza zakres tego pytania).

Moje pytania są podrzędne:

  1. Czy istnieje jakiś przełącznik GCC, że brakuje mi, że powinno działać? (Nie, nie chcę używać #pragma.)
  2. Czy to błąd, który został rozwiązany w nowszej wersji GCC?

Dla porównania, już przelewa się przez inne podobne pytania już, w tym następujące:

+0

Wielkie pisemne pytanie. – GManNickG

+0

znalazłeś rozwiązanie dla tego @bgoodr –

+0

Jeszcze nie. Może to być przypadek, że jest to naprawiony błąd w nowszych wydaniach kompilatora, ale ponieważ nie mam opcji uaktualnienia kompilatora w tym momencie, zamierzam po prostu poczekać, aż to zrobimy. – bgoodr

Odpowiedz

0

Wydaje mi się, że to, co potrzebujesz owinięcia skryptu powłoki wokół gcc.

  • Nazwij coś jak gcc-wrapper i g++-wrapper.
  • W pliku Makefile ustaw CC i CXX na owijki.
  • Niech opakowanie wywoła GCC i poprowadzi jego wyjście do innego programu, który wyszuka żądane ciągi ostrzegawcze.
  • Po wykryciu ostrzeżenia program wyszukiwania kończy pracę z błędem.
+0

Dzięki Zan. W rzeczywistości to, czego szukałem, to odpowiedź na pod-pytanie nr 1.Nie chcę wdawać się w sprawy związane z noszeniem owijaczy w celu zhakowania tego, co moim zdaniem powinno być wspierane przez GCC. Zaczynam dochodzić do wniosku, że jest to błąd (lub brak funkcji) w samym GCC. – bgoodr

1

Widzę błąd nawet bez flagi USE_CXX_CLASS. tj. g ++ jest zgodny z błędem zarówno dla funkcji członków klasy, jak i dla funkcji nie będących członkami. g ++ (GCC) 4.4.3 20100127 (Red Hat 4.4.3-4)