2010-02-07 12 views

Respuesta

42

Dado que la norma C++ ha sido aceptada, la práctica totalidad de la biblioteca estándar está dentro del espacio de nombres std. Por lo tanto, si no desea calificar todas las llamadas de biblioteca estándar con std::, debe agregar la directiva using.

Sin embargo,

using namespace std; 

se considera una mala práctica, ya que están prácticamente importando todo el espacio de nombres estándar, lo que abre muchas posibilidades para las colisiones de nombres. Es mejor para importar sólo las cosas en realidad se está utilizando en su código, como

using std::string; 
+14

+1 Por ser el único en mencionar que está mal visto. – GManNickG

23

Nada hace, es un atajo para evitar anteponiendo todo en ese espacio de nombres con std ::

+11

Y también se considera una mala práctica. – GManNickG

+2

su práctica incorrecta si lo hace el espacio de nombres global: D –

+7

@GMan, @Hassan: Está perfectamente bien usarlo en archivos de implementación, y peligroso en archivos de encabezado. ¿Por qué todos siguen diciendo "mala práctica"? No me gustaría trabajar en el código donde tengo que escribir 'std ::' por todas partes, así como no quiero importar ningún espacio de nombres implícitamente con 'using namespace some_tools;' – Potatoswatter

5

La capacidad para referirse a los miembros en el espacio de nombres std sin la necesidad de hacer referencia a std::member explícitamente. Por ejemplo:

#include <iostream> 
using namespace std; 

... 
cout << "Hi" << endl; 

vs

#include <iostream> 

... 
std::cout << "Hi" << std::endl; 
3

En primer lugar, esto no es necesario en C - C no tiene espacios de nombres. En C++, cualquier cosa en el espacio de nombres std que incluye la mayor parte de la biblioteca estándar. Si no se hace esto hay que acceder a los miembros del espacio de nombres de forma explícita, así:

std::cout << "I am accessing stdout" << std::endl; 
0

todos los archivos de la biblioteca estándar de C++ declara todas sus entidades dentro del espacio de nombres std.
por ejemplo: Para utilizar cin,cout definido en iostream

Alternativas:

using std::cout; 
using std::endl; 
cout << "Hello" << endl;
std::cout << "Hello" << std::endl;

0

Se utiliza cada vez que está utilizando algo que se declara dentro de un espacio de nombres. La biblioteca estándar de C++ se declara dentro del espacio de nombres std. Por lo tanto usted tiene que hacer

using namespace std; 

a menos que desee especificar el espacio de nombres al llamar a funciones dentro de otro espacio de nombres, así:

std::cout << "cout is declared within the namespace std"; 

Usted puede leer más sobre él en http://www.cplusplus.com/doc/tutorial/namespaces/.

3

En primer lugar, la directiva using nunca se requiere en C, ya que C no admite espacios de nombres en absoluto.

en realidad nunca La directiva using se requiere en C++ desde cualquiera de los elementos que se encuentran en el espacio de nombres se puede acceder directamente mediante un prefijo con std:: lugar. Así, por ejemplo:

using namespace std; 
string myString; 

es equivalente a:

std::string myString; 

Independientemente de si usted elige utilizar es una cuestión de preferencia, pero la exposición de toda la std espacio de nombres para ahorrar unos cuantos golpes de teclado es generalmente considerada mala forma. Un método alternativo que sólo expone los elementos particulares en el espacio de nombres es la siguiente:

using std::string; 
string myString; 

Esto le permite exponer sólo los elementos en el espacio de nombres que std particular necesita, sin el riesgo de exponer involuntariamente algo que no se hizo tener la intención de.

0

Nunca tiene que declarar usando namespace std; su uso es una mala práctica y se debe utilizar std :: si no desea escribir std :: siempre se podría hacer algo como esto en algunos casos:

using std::cout; 

Mediante el uso de std :: también puede indique qué parte de su programa usa la biblioteca estándar y cuál no. Lo cual es aún más importante que pueda haber conflictos con otras funciones que se incluyen.

Rgds Layne

+2

Es solo una mala práctica en el espacio de nombres global en los archivos de encabezado. En los archivos de implementación, a menudo es una buena idea. Guardar la escritura es irrelevante: tu editor debe teclear por ti.Es bueno porque hace que el código sea más legible que tener 'std ::' en todas partes, y más fácil de mantener que tener treinta líneas de 'usando std :: whatever;' en la parte superior de cada archivo. – Porculus

5

que definitivamente no debe decir:

using namespace std; 

en su C encabezados ++, ya que supera el punto central de la utilización de espacios de nombres (haciendo que constituiría "la contaminación del espacio de nombres"). Algunos recursos útiles sobre este tema son los siguientes: hilo

1) stackoverflow en Standard convention for using “std”

2) un artículo por Herb Sutter en Migrating to Namespaces

3) FAQ 27.5 de Marshall Cline de C++ Faq Lite.

1

Los espacios de nombre son una forma de envolver el código para evitar confusiones y los nombres no entran en conflicto. Por ejemplo:

common1.h del archivo:

namespace intutils 
{ 
    int addNumbers(int a, int b) 
    { 
     return a + b; 
    } 
} 

archivo Uso:

#include "common1.h"  
int main() 
{ 
    int five = 0; 
    five = addNumbers(2, 3); // Will fail to compile since the function is in a different namespace. 
    five = intutils::addNumbers(2, 3); // Will compile since you have made explicit which namespace the function is contained within. 

    using namespace intutils; 
    five = addNumbers(2, 3); // Will compile because the previous line tells the compiler that if in doubt it should check the "intutils" namespace. 
} 

Por lo tanto, cuando se escribe using namespace std todo lo que está haciendo es decirle al compilador que en caso de duda se debe buscar en el espacio de nombres std para funciones, etc., que no puede encontrar definiciones para. Esto se usa comúnmente en el código de ejemplo (y producción) simplemente porque hace que escribir funciones comunes, etc. como cout es más rápido que tener que calificar completamente cada uno como std::cout.

7

Técnicamente, es posible que deba utilizar usando (por espacios de nombres completos o nombres individuales) para poder utilizar argumento de búsqueda Dependiente.

Tenga en cuenta las dos funciones siguientes que usan swap().

#include <iostream> 
#include <algorithm> 

namespace zzz 
{ 
    struct X {}; 


void swap(zzz::X&, zzz::X&) 
{ 
    std::cout << "Swapping X\n"; 
} 
} 

template <class T> 
void dumb_swap(T& a, T& b) 
{ 
    std::cout << "dumb_swap\n"; 
    std::swap(a, b); 
} 

template <class T> 
void smart_swap(T& a, T& b) 
{ 
    std::cout << "smart_swap\n"; 
    using std::swap; 
    swap(a, b); 
} 

int main() 
{ 
    zzz::X a, b; 
    dumb_swap(a, b); 
    smart_swap(a, b); 

    int i, j; 
    dumb_swap(i, j); 
    smart_swap(i, j); 
} 

dumb_swap siempre llama std::swap - a pesar de que preferimos más el uso de zzz::swapzzz::X objetos.

smart_swap hace std::swap visible como una opción de retroceso (por ejemplo cuando se le llama con enteros), pero ya que no se puede considerar totalmente el nombre, zzz::swap se utilizará a través de la ADL para zzz::X.


Subjetivamente, lo que me obliga a utilizar using namespace std; está escribiendo código que utiliza todo tipo de objetos de función estándar, etc.

//copy numbers larger than 1 from stdin to stdout 
remove_copy_if(
    std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), 
    std::ostream_iterator<int>(std::cout, "\n"), 
    std::bind2nd(std::less_equal<int>(), 0) 
); 

OMI, en código como este std:: sólo hace ruidos en la línea.

No encontraría using namespace std; un delito atroz en tales casos, si se usa en el archivo de implementación (pero puede incluso restringirse al alcance de la función, como en el ejemplo de intercambio).

Definitivamente no coloque la instrucción using en los archivos de encabezado. La razón es que esto contamina el espacio de nombres para otros encabezados, que podrían incluirse después del delincuente, lo que podría generar errores en otros encabezados que podrían no estar bajo su control. (También agrega el factor sorpresa: personas, incluyendo el archivo no podría estar esperando todo tipo de nombres para ser visible.)

0

Nada requiere que hagas - a menos que esté ejecutor de C++ biblioteca estándar y desea evitar la duplicación de código cuando se declara archivos de cabecera tanto en "nuevo" y "viejo" estilo:

// cstdio 
namespace std 
{ 
    // ... 
    int printf(const char* ...); 
    // ... 
} 

.

// stdio.h 
#include <cstdio> 
using namespace std; 

Bueno, claro ejemplo es un tanto artificial (que igualmente bien podría utilizar llanura <stdio.h> y ponerlo todo en std en <cstdio>), pero Bjarne Stroustrup muestra este ejemplo en su .

Cuestiones relacionadas