Me han dicho que es malo tener "using namespace ns123" en un archivo de encabezado, pero no recuerdo cuál fue la razón. ¿Es de hecho algo malo que hacer, y por qué?¿Es incorrecto usar la palabra clave 'using' de C++ en un archivo de encabezado?
Respuesta
Es una mala práctica, en general, porque anula el propósito de los espacios de nombres. Al definir en un encabezado no está imponiendo un control estricto sobre el alcance de la declaración using, lo que significa que puede encontrarse con conflictos de nombres en lugares inesperados.
¿Estás hablando de directivas o declaraciones? ¿O ambos? – arekolek
A menudo le dará extraños y misteriosos errores de compilación, por un lado, donde puede pasar horas tratando de averiguar la raíz del problema.
Sacar todas las clases y funciones de su espacio de nombres es generalmente una mala idea y en realidad se opone al concepto de espacios de nombres ... generalmente es mejor usar 'usar' en una clase o función específica.
No es tan malo en un archivo .cpp, ya que ignoras los espacios de nombres en un área local. En un archivo .h, está ignorando espacios de nombres en un área grande y no bien definida. –
Si coloca una declaración using
en un archivo de encabezado, cualquier cosa que #include
s el archivo de encabezado también tenga importado el espacio de nombres, lo quieran o no. Esto viola el principio de menor sorpresa y anula el propósito de los espacios de nombres al permitir cambiar una declaración #include
para causar fácilmente una colisión de nombres. Si quieres importar un espacio de nombre en tu propio archivo .cpp para guardar un poco escribiendo y producir un código más legible, está bien. Simplemente no obligue a los usuarios de su módulo a hacer lo mismo.
'using namespace N;' es una directiva using, no una declaración using. Una declaración using puede ser apropiada, ya que solo afecta el nombre especificado en lugar de cualquier cosa y todo en N, si eso es lo que se desea. ('using N :: name;' es un ejemplo que usa declaración.) –
C++ Ordinaria Cómo Programar
Sí, hay lugares en los que a menudo esto tiene sentido, y usted tiene control sobre dónde y cómo se utiliza su utilizando stamenets. Si se trata de un programa con un alcance limitado, no necesita preocuparse por el uso de los lugares en el alcance global.
Para las aplicaciones monolíticas Yo recomendaría no colocar los usos en un espacio de nombres muy ocupado, ya que las colisiones te volverán loco una vez que estás comprometido. Por ejemplo:
- ::
- :: companyname
- :: companyname :: componente
- :: companyname :: componente :: sub-componente.
Yo diría que es perfectamente aceptable para empezar a cabo utilizando declaraciones en el nivel 3 o 4 - Ahí es donde las probabilidades de colisiones empezar a ser muy bajo.
genérico/TMP Programación
En la programación genérica y TMP usando a menudo se utiliza para configurar las bibliotecas para un dominio específico y esto se hace a menudo mediante el uso de declaraciones.
- 1. uso de la palabra clave "using" en C#
- 2. ¿Equivalente a la palabra clave "using" de C# en powershell?
- 3. Alternativas a la palabra clave directiva "using" en C#?
- 4. ¿Es posible que la palabra clave "using" herede menos funciones?
- 5. ¿Cómo uso programáticamente la palabra clave "usar" en C#?
- 6. C++ 11 `using` palabra clave: especialice el alias de la plantilla del parámetro de la plantilla
- 7. ¿Por qué debería usar la palabra clave "using" para acceder a mi método de clase base?
- 8. palabra clave C++ extern en las funciones. ¿Por qué no solo incluir el archivo de encabezado?
- 9. ¿Puedo usar la palabra clave `abstracta` en la clase C++
- 10. C++ const palabra clave: ¿usar liberalmente?
- 11. ¿Cuál es la palabra clave de rendimiento utilizada en C#?
- 12. Palabra clave en línea frente a la definición del encabezado
- 13. ¿Cuándo debería usar la palabra clave "this" en C++?
- 14. es palabra clave restringida "unix" en C?
- 15. ¿Cuándo se debe usar la palabra clave volátil en C#?
- 16. ¿Cuándo debemos usar la palabra clave extern alias en C#?
- 17. ¿Cuándo necesitaría usar la palabra clave stackalloc en C#?
- 18. Enlace interno con la palabra clave estática en C
- 19. ¿Cómo se resuelve el espacio de nombres .Net entra en conflicto con la palabra clave 'using'?
- 20. Archivo de clave incorrecto con MySQL
- 21. Ilustrando el uso de la palabra clave volátil en C#
- 22. ¿Cuál es la relación entre la palabra clave using y la interfaz IDisposable?
- 23. C: Comportamiento de la palabra clave `const`
- 24. C# Patrones de uso para la palabra clave "es"
- 25. ¿Cuándo NO DE USAR esta palabra clave?
- 26. C# ref uso de la palabra clave
- 27. C++: obteniendo un tamaño de archivo incorrecto
- 28. palabra clave "agradable" en C++?
- 29. Usar la palabra clave Me (VB.NET) ¿es obligatorio o no?
- 30. ¿La palabra clave 'evento' es opcional en C#?
Lo dejaste tácito pero creo que querías (y todas las respuestas actuales asumen) que estás hablando de usar directivas de alcance global en un encabezado. En ámbitos no globales (por ejemplo, en el espacio de nombres sobre el que ejerce control completo o dentro de una función) obtendrá una respuesta diferente. –
Esta pregunta sería mejor si aborda la preocupación planteada por Roger Pate. – arekolek