Принуждение GCC 4.x к обработке -Wreturn-типа как ошибки без включения -Werror? - PullRequest
5 голосов
/ 19 ноября 2010

Предположим, у нас есть следующий код:

#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 в данный момент времени (вероятно, сделаю это позже, но это выходит за рамки этого вопроса).

Мои подвопросы:

  1. Есть какой-то GCC-переключатель, который мне не хватает, который должен работать? (Нет, я не хочу использовать #pragma.)
  2. Это ошибка, которая была устранена в более поздней версии GCC?

Для справки, я уже разобрался с другими подобными вопросами, включая следующие:

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Я вижу ошибку даже без флага USE_CXX_CLASS. то есть g ++ согласуется с ошибкой как для функций-членов класса, так и для функций, не являющихся членами. g ++ (GCC) 4.4.3 20100127 (Red Hat 4.4.3-4)

0 голосов
/ 19 ноября 2010

Мне кажется, что вам нужна оболочка сценария оболочки вокруг gcc.

  • Назовите что-то вроде gcc-wrapper и g++-wrapper.
  • В вашем Makefile установите CC и CXX для упаковщиков.
  • Попросите обертку вызвать GCC и направить ее вывод в другую программу, которая будет искать нужные вам строки предупреждений.
  • Пропустить программу поиска с ошибкой при обнаружении предупреждения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...