2010-10-28 14 views
17

Duplicar posibles:
Why is 'using namespace std;' considered a bad practice in C++?¿Está usando el espacio de nombres ... como malo?

Cada vez que utilizo using namespace std Siempre tengo que "eso es un hábito de programación terrible". Ahora me graduaré este diciembre con mi B.S. en C.S. pero no pretendo saber todo, pero nadie ha explicado por qué esto es tan malo. Entiendo lo que significa, pero sinceramente no veo un gran problema con eso.

¿Alguien quiere explicarlo? En mi opinión, solo hace que escribir cout sea mucho más soportable que std::cout.

Puedo comprender por qué no le gustaría ponerlo en un archivo de cabecera, pero solo en un archivo de implementación normal ... No veo por qué sería un problema.

+1

'using namespace std' es un error de sintaxis en' C'. Pero 'using',' namespace', y 'std' en sí mismos son identificadores perfectamente legales (aunque desagradables) que puedes usar en tu código. – pmg

+1

@pmg ¿Nadie mencionó nada sobre C? – meagar

+10

Usar "me gusta" en una oración como esa es malo ... –

Respuesta

14

conocer este post útil en otra parte:

espacios de nombres se separan y organizan funcionalidad. Puede tener una función xander333::sort() y no entrará en conflicto con std::sort() o boost::sort() o cualquier otro tipo(). Sin espacios de nombres, solo puede haber un sort().

Ahora digamos que has puesto "using namespace std;" en todos sus archivos de origen y ha implementado una función de plantilla simple llamada fill() en el espacio de nombres global de uno de sus archivos. Este archivo también depende de un encabezado de libFoo - foo.hpp. La versión 2.1 de libFoo sale y, de repente, su programa ya no se compila. ¡Tu versión de fill() de repente entra en conflicto con otra fill()! ¿Que pasó?

Resulta que la gente ejecución libtal incluidas en la nueva versión de foo.hpp cuando no lo hicieron antes. Ahora tiene todos los algoritmos estándar incluidos en su archivo fuente, y su using namespace std; los ha arrastrado a todos al espacio de nombres global. std::fill() ahora entra directamente en conflicto con su fill().

Más insidioso, ha obtenido su código para compilar al cambiar el nombre de su fill() a , pero algo no está funcionando bien - sus números de informe están apagados. Resulta que su función personalizada divides(), que hace matemáticas de precisión fija, ya no se llama porque la función de plantilla de (también recientemente incluida por foo.hpp) hace una mejor coincidencia porque los tipos de llamada no coinciden exactamente con los tipos declarados .

de rosca con la discusión es relevante aquí:

http://www.cplusplus.com/forum/unices/27805/

+3

O para decirlo de manera más simple, es fácil obtener colisiones de nombres en el futuro y pueden ser insidiosos para corregirlo después de los hechos. – Inverse

2

Mi preferencia es:

  1. Nunca ponga una directiva using en un fichero de cabecera (las cosas que incluyen el encabezado puede no como el hecho de que se les obligó a tener la directiva using).

  2. Siempre haga cosas como usar std :: cout; en la parte superior de los archivos de implementación, así que no tengo que hacer std :: cout en todas partes en mi código.

+2

verificación de terminología: using namespace std; y similares se llaman usando directivas (no usando declaraciones). usando std :: cout etc. se llaman usando declaraciones.:) –

+0

Ha pasado mucho tiempo desde que lo hice C++ - thx Lo arreglaré :-) – TofuBeer

3

una "buena práctica" que yo sepa no es poner en using namespace incluir archivos, pero la libertad de usar a su gusto en sus archivos .cpp privadas. Conozco personas a las que les gusta que todo esté totalmente calificado, y algunas (como yo) que suponen que string es un std::string a menos que se indique lo contrario.

La razón de esto es que si/cuando otros usan su archivo de inclusión (y esto sucede siempre), se ven obligados a aceptar su estilo de programación.

¡Buena suerte!

23

no hay ningún problema usando using namespace std en el archivo de origen cuando se hace un uso intensivo de la STL y sabe con seguridad que nada va a colisionar.

Sin embargo, muy a menudo no es necesario utilizar using namespace std o no en la totalidad del archivo:

sabía usted puede:

void somefunction() 
{ 
    // Use it in a particular scope 
    using namespace std; 

    cout << "test" << endl; 
} 
+2

Advertencia: realmente no se puede saber eso con certeza. (A menos que nunca cambie las versiones del compilador/biblioteca) – sehe

1

Es principalmente acerca de una buena limpieza. Si realmente no va a utilizar más que unos pocos identificadores en un espacio de nombres, ¿por qué saturar su propio espacio de nombres al colocar todos los identificadores de ese espacio de nombres en el suyo? Es preferible usar using std::cout. Sin embargo, si utiliza un espacio de nombres muy fuerte y no causa ninguna colisión, continúe y use using namespace.

0

Evitar el uso de declaraciones para espacios de nombres completos ayuda a evitar conflictos involuntarios entre bibliotecas. Supone que hizo su propia clase que tenía el mismo nombre que algo en std, entonces, a menos que use explícitamente std::, tendrá conflictos de nombres.

Probablemente sea mejor intentar evitar conflictos como este en primer lugar, pero si especifica el espacio de nombres para cada miembro en su código, será menos ambiguo.

Si se cansa de escribir std :: cout todo el tiempo, puede usar una instrucción using para ese miembro.

1

Otra razón para no utilizar using que no sea evitar posibles colisiones de nombres es acelerar su IDE y posiblemente compilar.

Si está usando Visual Studio, using namespace std y/o using namespace boost pueden matar intellisense por completo. Hay muchos símbolos en estos espacios de nombres de los que no se da cuenta y puede ser absurdo descargarlos en el espacio de nombres global.

Cuestiones relacionadas