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:
- Czy istnieje jakiś przełącznik GCC, że brakuje mi, że powinno działać? (Nie, nie chcę używać
#pragma
.) - 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:
- 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?
Wielkie pisemne pytanie. – GManNickG
znalazłeś rozwiązanie dla tego @bgoodr –
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