2010-11-27 26 views
2

je la fonction suivante:compilateur ne se plaint pas de valeur fonction ne pas retourner

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

cette compile parfaitement bien, mais ne devrait pas le compilateur se plaindre de l'absence d'une déclaration de retour?

EDIT 0: GNU compilateur g ++

+1

Quel compilateur utilisez-vous? Le compilateur Visual C++, je me plains plutôt de votre extrait de code avec un C4716. –

+0

@TheFuzz: Mine se plaint plutôt fort aussi comme il se doit! –

+0

J'ai fait un montage. J'utilise le compilateur gnu g ++ – TheFuzz

Répondre

4

Essayez de compiler avec option -Wall (gcc) [-Wreturn-type pour être plus précis]. Vous un obtenez un quelque chose d'avertissement comme « contrôle atteint la fin d'une fonction non-vide » ou quelque chose comme « aucune déclaration de retour en fonction de retour non vide »

Exemple:

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> 

Utilisation du retour La valeur d'une fonction non-nulle (sans déclaration de retour) est un comportement indéfini.

+0

-Wall est répertorié comme l'une des options que mon compilateur utilise actuellement. Il ne se plaint toujours pas. – TheFuzz

+2

Vous avez besoin de "-Wall", pas de "-wall"; les options de la ligne de commande sont sensibles à la casse. Notez que "-w" est "inhiber tous les messages d'avertissement". – janm

+0

@TheFuzz Je reçois ce qui suit quand j'utilise -Wall: "test.cpp: Dans la fonction membre 'bool Server :: ServerInit()': test.cpp: 14: avertissement: le contrôle atteint la fin de la fonction non-vide" – chrisaycock

1

est ici la raison pour laquelle vous ne recevez pas d'erreur/avertissement est quelque chose qui est connu comme un comportement non défini (UB)

6.6.3/2 $ - « Flowing l'extrémité d'un fonction est équivalente à un retour sans valeur; cela se traduit par un comportement non défini dans un "

fonction de valeur-retour

Malheureusement, une compilation propre avec/sans avertissement a. partie de tout autre comportement imaginable fait partie de UB. Comme @Prasoon l'a mentionné, la fonction 'main' est une exception à cette règle.

+1

Ajoutez également que 'main()' est une exception à cette règle. ':)' –

+0

@Prasoon Saurav: Bon point. Mise à jour de mon message – Chubsdad