Предположим, у нас есть следующий код:
#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;
}
И предположим, что он должен быть скомпилирован компилятором C ++ (а не компилятором C) из GCC версии 4.2.1 с параметрами -Wreturn-type -Werror=return-type
. Если приведенный выше код скомпилирован как есть без предварительного раскомментирования строки //#define USE_CXX_CLASS
выше, то вы увидите предупреждение , но без ошибки :
.../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
Но если строка //#define USE_CXX_CLASS
не закомментирована, то предупреждение равно и считается ошибкой:
.../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
Да, одна функция не является членом (случай № 2), а другая - это функция C ++ (случай № 1). ИМО, это не должно иметь значения. Я хочу, чтобы оба условия рассматривались как ошибка, и я не хочу добавлять -Werror
или -Wall
в данный момент времени (вероятно, сделаю это позже, но это выходит за рамки этого вопроса).
Мои подвопросы:
- Есть какой-то GCC-переключатель, который мне не хватает, который должен работать? (Нет, я не хочу использовать
#pragma
.)
- Это ошибка, которая была устранена в более поздней версии GCC?
Для справки, я уже разобрался с другими подобными вопросами, включая следующие: