Comment utiliser une variable locale dans une autre étendue en C ++?

Je veux accéder à une variable locale de la fonction principale d’une autre scope.
Mon objective est d’imprimer 20 en cout .
Comment puis-je faire ceci?
Comment est-ce possible en C ++?

 int var = 10; int main(int argc, char *argv[]) { int var = 20; // this var { int var = 40; cout << ::var; // I want to print `var` variable in main scope. // But this command print global variable. } return 0; } 

Il n’y a aucun moyen d’y parvenir. Le langage ne permet pas de différencier la première var in main de la seconde var .

Si vous écrivez un code de production, évitez d’utiliser de telles variables. Cela mènera à un code buggy. Vous serez confus quant à la variable en cours dans une ligne de code donnée.

Vous ne pouvez pas accéder à une variable (dans certains cas, extern peut être utilisé, mais pas dans votre code) en dehors de sa scope. Ainsi, vous ne pouvez pas utiliser la variable var (déclarée à l’intérieur du bloc le plus interne) en dehors de sa scope. Par exemple,

 int var = 10; int main(int argc, char *argv[]) { int var = 20; // this var { int var = 40; } cout << var; // this will access var declared first and prints 20 return 0; } 

Et croyez-moi, il n’est pas nécessaire de déclarer et d’utiliser des variables de cette manière. Cela mènera à un code buggy. Rappelez-vous que si vous utilisez GCC ou clang, utilisez toujours l' -Wshadow compilateur lors de la compilation, car il affiche un avertissement si quelque chose comme cela est fait n'importe où dans le code. Essayez de l'inclure dans votre IDE ou votre makefile si vous ne comstackz pas votre code à partir du terminal.

CAS A

 int var = 10; int main(int argc, char *argv[]) { int var = 20; // this var { int var = 40; cout << ::var; // This will output 10 because you have used scope of operator that'll point to global variable in C++. } return 0; } 

CAS B

 int var = 10; int main(int argc, char *argv[]) { int var = 20; // this var { int var = 40; cout < 

CAS C

 int var = 10; int main(int argc, char *argv[]) { int var = 20; // this var { int var = 40; } cout << var; // this will output 20 because using var that is declared in main() function. return 0; } 

Concernant votre exemple de code

 int var = 10; int main(int argc, char *argv[]) { int var = 20; // this var { int var = 40; cout << ::var; // I want to print `var` variable in main scope. // But this command print global variable. } return 0; } 

… Et l'objective déclaré dans le commentaire,

« Je veux imprimer une variable var dans la scope principale

… Vous pouvez le faire comme suit, en ajoutant simplement un alias pour cela:

 int var = 10; int main() { int var = 20; // this var { auto& outer_var = var; int var = 40; cout << outer_var; } } 

C ++ ne fournit pas de mécanisme de résolution d'étendue qui puisse le faire pour vous. S'il existait un tel mécanisme, par exemple une résolution de scope relative ou des noms de fonction sous forme de pseudo noms d'espaces de noms, il serait vraisemblablement utilisé et l'on verrait alors au moins un code difficile à comprendre en raison de l'utilisation du même nom pour différentes choses dans un court morceau de code. Une autre conception de langage est semblable à C #, où l’ombre (comme la var interne, la var externe) est tout simplement interdite.

De même, C ++ ne fournit aucun moyen de fournir des noms supplémentaires pour l'espace de noms global. D'autres espaces de noms peuvent être aliasés, mais pas l'espace de noms global, de sorte que vous pouvez être certain que celui-ci n'est pas référencé via quelque chose ressemblant à companyname::counter , par exemple.

C ++ a également une ressortingction sur les opérateurs qui peuvent être surchargés par les fonctions de la scope de l'espace de noms, afin de fournir une mesure de sécurité, sur laquelle on peut absolument compter. En ce qui concerne cette dernière raison, je connais celle de Bjarne Stroustrup (le créateur du langage). En ce qui concerne la raison du manque de résolution relative de la scope et du manque d'alias d'espace de noms global, il ne s'agit que d'une supposition nuancée qu'il s'agisse de la même chose, mais cela rest logique. 🙂