Goto peut-il parcourir des fonctions sans invoquer de destructeurs ?
Une idée fausse courante persiste selon laquelle goto ignore des sections de code, évitant ainsi l'exécution de destructeurs et autres opérations. Cette méprise est particulièrement prononcée dans les discussions autour du C.
Restrictions de portée
Contrairement à la croyance populaire, goto ne peut pas traverser les limites des fonctions. Tenter d'accéder à une étiquette définie dans une fonction différente entraîne une erreur du compilateur, comme illustré ci-dessous :
void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; }
Erreur : l'étiquette 'lol' utilisée mais non définie
Objet Considérations sur l'initialisation
Le saut à travers l'initialisation d'un objet est également interdit. Si vous tentez d'ignorer l'initialisation d'un objet, le compilateur signalera une erreur :
int main() { goto lol; int x = 0; lol: return 0; }
Erreur : passer à l'étiquette 'lol'
Erreur : à partir d'ici
Erreur : croise l'initialisation de 'int x'
Spécifique à la portée Destruction
Les objets avec durée de stockage automatique sont détruits à la sortie de leur portée, quelle que soit la méthode de sortie. Goto ne peut donc pas contourner la destruction d'objet :
struct T { T() { cout << "*T"; } ~T() { cout << "~T"; } }; int main() { { T t; goto lol; } lol: return 0; }
Sortie : *T~T
Restrictions de type d'objet
En sautant dans la portée d'objets non scalaires est généralement interdit, il existe des exceptions pour les objets avec des constructeurs et destructeurs par défaut triviaux. Les déclarations de tableau sans initialiseurs sont également exemptées.
Conclusion
Goto, bien qu'il ne s'agisse pas d'une faille qui contourne les mécanismes de portée de C, peut provoquer un comportement imprévu s'il est utilisé avec négligence. Néanmoins, les restrictions décrites ci-dessus fournissent des garanties contre une utilisation involontaire ou nuisible de Goto. Par conséquent, ce n’est pas intrinsèquement mauvais comme on le perçoit généralement, mais doit être appliqué avec discrétion.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!