Ce code illustre quelque chose que je pense, devrait être traitée comme une mauvaise pratique, et obtenir des mises en garde d'un compilateur de redéfinir ou de masquer une variable:En C++, quand deux variables du même nom peuvent-elles être visibles dans la même portée?
#include <iostream>
int *a;
int* f()
{
int *a = new int;
return a;
}
int main()
{
std::cout << a << std::endl << f() << std::endl;
return 0;
}
Sa sortie (compilé avec g ++):
0
0x602010
J'ai regardé quelques références (Stroustrup et The Complete C++ Reference) et je ne trouve rien à propos de quand et pourquoi cela est autorisé. Je sais que ce n'est pas dans une portée locale unique, cependant.
Quand et pourquoi est-ce autorisé? Y a-t-il un bon usage pour cette construction? Comment puis-je obtenir g ++ pour m'en prévenir? Est-ce que d'autres compilateurs crient à ce sujet?
"Toutes les langues permettent ce genre de chose". Le langage de programmation de ma calculatrice TI-85 ne le fait pas. Toutes les variables sont globales et aucun nom ne se cache. –
.NET (VB, C#) ne permet pas cela aussi! – Dario
L'interdiction de l'ombrage de C# m'exaspère à n'en plus finir lorsque j'utilise des fonctions d'ordre supérieur. –