LINUX.ORG.RU

Должно ли выдаваться сообщение об ошибке?


0

0

Один из моих исходников sample.cpp содержал примерно следующий текст:

int anyfunction(int a, const char *s) { ..... //тело функции. }

то есть в конце я забыл поставить оператор

return <выражение целого типа>;

Однако компилятор (gcc версия 3.2) совершенно спокойно это проглотил. Никаких сообщений об ошибках или предупреждений не было.

Является ли это глюком компилятора (этот компилятор - порт gcc под винду)? По-моему в C++ это должно вызвать как минимум, предупреждение.

Сталкивался ли кто-то с подобным поведением gcc под Linux'ом?

компилятор не обязан это делать.

используй gcc с варнинговыми опциями. gcc -Wall

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Только что попробовал сделать следующее: 

int main(int n, char **args)
{
    .....
    .....
//  return 0;
}

Даже после команды

gcc -c -Wall main.cpp

компилятор проглотил это без единого звука! Повторяю, это порт gcc под Винду(а если точнее - это mingw), версия 3.2. Может, у нормального, linux'ового компайлера такого безобразия нет?
На мой взгляд, пропуск оператора return - серьезная ошибка, которая
наверняка приведет к ошибке времени выполнения и аварийному останову.






sashkacpp
() автор топика
Ответ на: комментарий от sashkacpp

gcc под linux дает предупреждение. Но тебе-то от этого не легче, верно?

nobody ★★
()
Ответ на: комментарий от sashkacpp

Тоже mingw, тоже 3.2. Предупреждение выдается.

C:\projects\temp>cat ret.c
int main(int n, char **args)
{
// return 0;
}

C:\projects\temp>gcc -c -Wall ret.c
ret.c: In function `main':
ret.c:4: warning: control reaches end of non-void function

C:\projects\temp>gcc -v
Reading specs from C:/programs/MinGW/bin/../lib/gcc-lib/mingw32/3.2/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=min
gw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=f77,c++,objc,ada --disable-wi
n32-registry --disable-shared
Thread model: win32
gcc version 3.2 (mingw special 20020817-1)

anonymous
()
Ответ на: комментарий от anonymous

Совершенно верно!
Если дать файлу расширение "c", то предупреждение выдается и у меня-
только что попробовал:

C:\MINGW\PRJ>type ret.c
int main(int n, char **args)
{
//    return 0;
}


C:\MINGW\PRJ>gcc -c -Wall ret.c
ret.c: In function `main':
ret.c:4: warning: control reaches end of non-void function

Однако, если изменить расширение на "cpp" (я-то использую C++),
то молчит, как партизан:

C:\MINGW\PRJ>gcc -c -Wall ret.cpp
C:\MINGW\PRJ>

C:\MINGW\PRJ>gcc -v
Reading specs from C:/MINGW/BIN/../lib/gcc-lib/mingw32/3.2/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
-languages=f77,c++,objc,ada --disable-win32-registry --disable-shared
Thread model: win32
gcc version 3.2 (mingw special 20020817-1)

По-моему, если в C выдается предупреждение, то в C++ - уж тем более
должно!


sashkacpp
() автор топика
Ответ на: комментарий от sashkacpp

В c++, если нет явного return в конце main, предполагается неявный `return 0'.

C:\projects\temp>cat ret.cpp
int f() {}

int main(int n, char **args)
{
        f();
        //return 0;
}

C:\projects\temp>g++ -Wall ret.cpp
ret.cpp: In function `int f()':
ret.cpp:1: warning: control reaches end of non-void function

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.