编译器不会抱怨函数没有返回值

问题描述 投票:0回答:2

我有以下功能:

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++ 编译器

c++ compiler-errors return g++
2个回答
8
投票

尝试使用

-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>

使用非 void 函数的返回值(没有 return 语句)是未定义行为。


1
投票

这就是为什么您没有收到错误/警告的原因,因为它被称为未定义行为(UB)

$6.6.3/2 - “从末端流出 函数相当于一个返回 没有价值; 这导致 中的未定义行为 返回值函数。

不幸的是,除了任何其他可以想象的行为之外,带/不带警告的干净编译都是 UB 的一部分。

正如 @Prasoon 提到的,“main”函数是此规则的一个例外。

© www.soinside.com 2019 - 2024. All rights reserved.