2017-08-02 5 views
0

Je ne suis pas en mesure d'expliquer pourquoi la construction de code suivante en C++ ne donne aucune erreur de compilation ou d'avertissement même avec l'option -Wall.Référence non initialisée en C++ (déclarée en utilisant extern)

Dire qu'il ya un fichier d'en-tête, referencesTest.hpp, où une référence à int est déclarée en utilisant extern comme ceci:

#ifndef REFERENCES_TEST_HPP 
#define REFERENCES_TEST_HPP 

extern int &refToInt; 

#endif /* REFERENCES_TEST_HPP */ 

Dans le fichier source correspondant, referencesTest.cpp, nous avons alors la référence définie mais qui reste non initialisée et nous essayons de lui attribuer une valeur au moment de l'exécution comme ceci:

#include "referencesTest.hpp" 

//Why no error/warning is raised here ? 
int &refToInt; 

int main() 
{ 
     int testVariable = 8; 

     //This crashes on run time with Seg fault but no compilation error/warnings. 
     refToInt = testVariable; 

     return 0; 
} 

Lorsque compilé avec la version de GCC 5.4.0

g++ -Wall referencesTest.cpp -o output 

il se bloque avec une erreur de segmentation au moment de l'exécution, mais pourquoi le compilateur n'a-t-il pas généré d'erreur/avertissement ici? Mon sous-estimation était que les références en C++ doivent toujours être initialisées lorsqu'elles sont déclarées. Quelqu'un peut-il aider à expliquer pourquoi les compilateurs de code ci-dessus?

Répondre

0

Ce comportement n'est pas défini. Différents compilateurs auront différentes façons de gérer cela. Par exemple, Visual Studio a généré une erreur lorsque j'ai essayé de faire ce que vous avez fait.

+0

Salut Devin .. Merci pour votre réponse! Est-ce mentionné quelque part dans la norme? –

+0

La norme n'impose aucune exigence en matière de comportement indéfini. Désolé, je ne peux pas vous référer à la documentation, car cela coûte de l'argent à acquérir. Je connais juste ce fait de divers messages sur Stack Overflow. –