descargar - ¿Cuál es el alcance de la declaración de "uso" en C++?
c++ manual (7)
Estoy usando la declaración ''using'' en C ++ para agregar std :: string y std :: vector al espacio de nombres local (para guardar el tipeo innecesario ''std ::'' s).
using std::string;
using std::vector;
class Foo { /*...*/ };
¿Cuál es el alcance de esta declaración? Si hago esto en un encabezado, ¿inyectará estas declaraciones ''using'' en cada archivo cpp que incluya el encabezado?
Cuando #incluye un archivo de encabezado en C ++, coloca todo el contenido del archivo de encabezado en el lugar donde lo incluyó en el archivo de origen. Por lo tanto, incluir un archivo que tenga una declaración de using
tiene exactamente el mismo efecto de colocar la declaración de using
en la parte superior de cada archivo que incluye ese archivo de encabezado.
El alcance de la instrucción using depende de dónde se encuentra en el código:
- Colocado en la parte superior de un archivo, tiene alcance en ese archivo.
- Si se trata de un archivo de encabezado, tendrá alcance en todos los archivos que incluyan ese encabezado. En general, esto " no es una buena idea ", ya que puede tener efectos secundarios inesperados
- De lo contrario, el enunciado use tiene alcance dentro del bloque que lo contiene desde el punto donde ocurre hasta el final del bloque. Si se coloca dentro de un método, tendrá alcance dentro de ese método. Si se coloca dentro de una definición de clase, tendrá alcance dentro de esa clase.
El alcance es el alcance en el que esté la declaración de uso.
Si este es el alcance global, entonces será a nivel mundial. Si está en el alcance global de un archivo de encabezado, entonces estará en el alcance global de cada archivo fuente que incluya el encabezado.
Por lo tanto, el consejo general es evitar el uso de declaraciones en el alcance global de los archivos de encabezado .
En el caso citado, el archivo ("unidad de traducción"), que significa sí, cada archivo que lo incluye.
También puede poner la instrucción using dentro de la clase, en cuyo caso, está en vigencia solo para esa clase.
En general, si necesita especificar un espacio de nombre en un encabezado, a menudo es mejor calificar completamente todos los identificadores necesarios.
Eso es correcto. El alcance es el módulo que usa la declaración using
. Si los archivos de encabezado que incluye un módulo tienen using
declaraciones, el alcance de esas declaraciones será ese módulo, así como cualquier otro módulo que incluya los mismos encabezados.
Hay algunos comentarios que no están calificados cuando dicen "No hacer". Eso es demasiado severo, pero debes entender cuándo está bien.
Escribir using std::string
nunca está bien. Escribir using ImplementationDetail::Foo
en su propio encabezado, cuando ese encabezado declara ImplementationDetail :: Foo puede estar bien, más aún si la declaración de uso ocurre en su espacio de nombres. P.ej
namespace MyNS {
namespace ImplementationDetail {
int Foo;
}
using ImplementationDetail::Foo;
}
No hay nada especial acerca de los archivos de cabecera que mantendrían fuera la declaración de using
. Es una simple sustitución de texto antes de que comience la compilación.
Puede limitar el using
una declaración a un ámbito:
void myFunction()
{
using namespace std; // only applies to the function''s scope
vector<int> myVector;
}