компилятор не жалуется на функцию, не возвращающую значение - PullRequest
4 голосов
/ 27 ноября 2010

У меня есть следующая функция:

bool Server::ServerInit()
{
//  bool listenResult = socket.Listen( (const uint8 *)_LOCAL_HOST, m_iPort );
//  if( true == listenResult )
//      cout << "Server passive socket listening\n";
//  else
//      cout << "Server passive socket not listening\n";
//      
//  return listenResult;
} // ServerInit()

это прекрасно компилируется, но не должен ли компилятор жаловаться на отсутствие оператора return?

РЕДАКТИРОВАТЬ 0: GNU g ++ compiler

Ответы [ 2 ]

7 голосов
/ 27 ноября 2010

Попробуйте скомпилировать с опцией -Wall (gcc) [-Wreturn-type, чтобы быть более точным].Вы получите предупреждение типа «Управление достигает конца функции, не являющейся пустым», или что-то вроде «нет оператора возврата в функции, возвращающей не пустоту»

Пример:

C:\Users\SUPER USER\Desktop>type no_return.cpp
#include <iostream>
int func(){}

int main()
{
   int z = func();
   std::cout<< z; //Undefined Behaviour
}
C:\Users\SUPER USER\Desktop>g++ -Wall no_return.cpp
no_return.cpp: In function 'int func()':
no_return.cpp:2:12: warning: no return statement in function returning non-void

C:\Users\SUPER USER\Desktop>

Использование возвращенного значения не пустой функции (без оператора return) является неопределенным поведением.

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

Вот причина того, почему вы не получаете сообщение об ошибке / предупреждение, поскольку это то, что известно как неопределенное поведение (UB)

$ 6.6.3 / 2 - «Стекает с конца функция эквивалентна возврату без значения; это приводит к неопределенное поведение в функция, возвращающая значение."

К сожалению, чистая компиляция с предупреждением или без него, за исключением любого другого мыслимого поведения, является частью UB.

Как упоминалось в @Prasoon, функция 'main' является исключением из этого правила.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...