Este código ilustra algo que creo que debe ser tratada como una mala práctica, y obtener advertencias de un compilador de redefinir o enmascarar una variable:En C++, ¿cuándo pueden verse dos variables del mismo nombre en el mismo ámbito?
#include <iostream>
int *a;
int* f()
{
int *a = new int;
return a;
}
int main()
{
std::cout << a << std::endl << f() << std::endl;
return 0;
}
Su salida (compilados con g ++):
0
0x602010
He visto un par de referencias (Stroustrup y The Complete C++ Reference) y no puedo encontrar nada sobre cuándo y por qué está permitido. Sin embargo, sé que no está dentro de un ámbito local único.
¿Cuándo y por qué se permite esto? ¿Hay un buen uso para esta construcción? ¿Cómo puedo obtener g ++ para advertirme al respecto? ¿Los demás compiladores graznan al respecto?
"Todos los idiomas permiten este tipo de cosas". El lenguaje de programación en mi calculadora TI-85 no. Todas las variables son globales y no hay ningún nombre escondido. –
.NET (VB, C#) no permite esto también! – Dario
La prohibición de C# de sombrearme me exaspera infinitamente cuando estoy usando funciones de orden superior. –