Je retouche mes compétences en C ++. Au cours de cela, je suis tombé sur la manipulation des exceptions et j'ai remarqué qu'une variable non déclarée ne provoque pas d'exception, qui est étrange pour moi.
Je m'attendais à ce programme de mettre fin à une exception non capturée (si le compilateur est correctement défini), Parce que dans le bloc d'essai, j'essaie d'accéder à une variable non déclarée. Est-ce que quelqu'un pourrait m'aider à comprendre pourquoi je ne reçois pas une exception (non capturée)? P>
4 Réponses :
Vous n'appelez pas Nous ne sommes pas comme dans Java où la machine virtuelle lancer des exceptions en soi, en C ++, les exceptions doivent être explicitement lancées p> maygowrong code>, donc il ne fait pas le lancer p>
puissantgowrong; code> n'est pas un accès non valide, il vient de renvoyer l'adresse de la fonction p>
Ce ne serait pas une exception en Java non plus, bien que vous ayez raison que la langue ne déclenche jamais un lancer code> de la manière dont la "mise en œuvre" Java pourrait. Bien sûr, les fonctions de la bibliothèque peuvent, mais elles vivent dans "l'espace utilisateur", donc ce n'est pas tout à fait une comparaison juste.
@LightnessRacksinorbit Dans ce cas Oui, je parle en général
Le ESSAYER puissantgowrong; code> -Statement de votre
Essayez code> -Block ne se réfère pas à une variable mais à fonctionner
puissantgowrong () code>; Notez que vous n'appelez pas la fonction mais utilisez simplement son nom sans l'attribuer à quelque chose; Comme le symbole
puissante code> est connu, il ne s'agit que d'une "non opération", cédant probablement des avertissements, mais pas une erreur lors de la compilation, et - comme cela ne fera pas appeler la fonction - il ne jette rien de au moment de l'exécution. P>
MAILGOWRONG () CODE> Au lieu de cela et voyez ce qui se passe. P>
Nommer les variables qui n'existent pas ne provoquent pas une exception; Il provoque un échec de compilation de votre programme.
Mais vous ne le faites pas. Vous nommez une fonction. Vous n'avez pas appelé cela et vous n'avez rien fait avec cela, mais vous nommez que c'est légal et est un «non-op», c'est-à-dire une déclaration qui ne fait rien. P>
C'est un peu comme faire cela : p> totalement inutile (et votre compilateur émettra probablement un avertissement), mais pas illégal! P> Pourquoi n'est-ce pas illégal quand c'est inutile? Eh bien, pas de grande raison. Il n'y a tout simplement aucun point qui l'interdire. P> p>
Pour le souci de Nitpicks et prouvant que rien n'est vraiment inutile en C ++: un ensemble de surcharge ne peut pas apparaître dans une expression rejetée, ni une fonction indéfinie auto code>. Cela peut être détecté avec Sfinae et réagi sans essayer d'appeler ou d'assumer quoi que ce soit d'autre sur la fonction :)
@Quentin heh, chiffres: D
remarqué qu'une variable non déclarée ne provoque pas d'exception p>
Du point de vue de la langue, il n'existe pas de "variable non déclarée". Un identifiant est une variable lorsqu'elle a été déclarée variable. Si quelque chose n'a pas été déclaré, alors ce n'est pas une variable. P>
Peu importe, si vous utilisez un identifiant non déclaré em>, alors le programme est mal formé. La norme ne dit pas que des programmes mal formés lancent une exception et, à mesure que de telles attentes sont erronées. En fait, la norme n'exige pas que des programmes mal formés soient compilés avec succès et, en cas d'identificateur non déclaré, je ne m'attendrais pas à ce que aucun compilateur le fasse. P>
puissante code> n'est ni non déclaré, ni une variable. Il est déclaré être une fonction. Le comportement de
puissantgowrong; code> n'est pas de jeter une exception. En fait, cette déclaration n'a aucun effet. Bien que de telles déclarations soient bien formées, elles sont rarement ce que le programmeur est intégré et, en tant que tel, il est probable que le compilateur délivrerait un avertissement au programmeur. Dans ce cas, vous pouvez voir: p>
xxx pré> blockQuote>
Quelle variable non déclarée? Les fonctions se décomposent aux pointeurs à eux-mêmes, et c'est ce qui se passe avec l'expression i>
puissante code>: il se désintègre à
& puissante code>, puis le résultat (le pointeur) est simplement ignoré et jeté.
Vous n'accédez pas à une variable non déclarée, mais mentionnez simplement un pointeur de fonction dans une déclaration.
NB: Activez les avertissements du compilateur!
De plus, si vous vraiment i> avait une variable non déclarée que vous avez essayé d'utiliser, alors cela conduirait à une erreur de construction i>, pas une exception au moment de l'exécution.
Et même s'il s'agissait de la "variable non déclarée", il ne jetterait pas une exception (exécution) mais entraînerait une erreur de compilateur.
Un compilateur raisonnable devrait produire le message "AVERTISSEMENT: déclaration n'a aucun effet" ou quelque chose à cet effet. Pensez à augmenter le niveau d'avertissement lors de la compilation.
@SomeProGrammerDude fait que le nom d'une fonction se décompose réellement dans une expression de valeur rebartée? Et cela compte-t-il de quelque manière que ce soit, qu'il se désintègre ou non?
En C ++, une exception est quelque chose que Votre code B> crée avec
lancer code>. Il y a beaucoup de choses qui sont appelées "exceptions", en particulier dans le domaine de l'arithmétique de point flottant, mais elles ne sont pas c ++ exceptions. Si vous ne
Jetez CODE>, ce n'est pas une exception.