2010-11-27 86 views
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語句?

EDIT 0:GNU克++編譯器

+1

你使用什麼編譯器? Visual C++編譯器我用C4716大聲抱怨你的代碼片斷。 – 2010-11-27 06:40:12

+0

@TheFuzz:我的聲音太大聲抱怨了! – 2010-11-27 06:41:22

+0

我做了一個編輯。我正在使用gnu g ++編譯器 – TheFuzz 2010-11-27 06:42:59

回答

4

嘗試用-Wall選項(GCC)編譯[-Wreturn-type更精確。你會得到一個警告一個類似於「控制達到一個非void函數的結束」或者類似的東西「在功能上沒有return語句返回非空」

例子:

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> 

使用返回非無效函數的值(沒有返回語句)是未定義行爲。

1

這裏的原因,爲什麼你因爲這是一些東西,被稱爲未定義行爲沒有得到錯誤/警告(UB)

$ 6.6.3/2 - 「流動斷 結束功能等同於沒有值回 ; 這導致 不確定的行爲在 返回值的函數

不幸的是,一個乾淨的編譯有/無警告一個。部分來自任何其他可以想象的行爲都是UB的一部分。

作爲@Prasoon提到,'main'函數是這個規則的一個例外。