2010-02-09 12 views
11

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?

+4

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. –

+0

Esta pregunta sería mejor si aborda la preocupación planteada por Roger Pate. – arekolek

Respuesta

24

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.

+0

¿Estás hablando de directivas o declaraciones? ¿O ambos? – arekolek

1

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.

3

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.

+2

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. –

16

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.

+3

'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.) –

1

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:

  1. ::
  2. :: companyname
  3. :: companyname :: componente
  4. :: 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.

Cuestiones relacionadas