Descontando semánticas sutilmente diferentes debido a ADL, ¿cómo debería usarlo en general using
y por qué? ¿Depende de la situación (por ejemplo, el encabezado que será #include
d frente al archivo fuente que no)?
Además, ¿debería preferir ::std::
o std::
?
Nivel de espacio de nombres
using namespace
:using namespace std; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Siendo completamente explícito:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { return std::make_pair(s.begin(), s.end()); }
Declaraciones de uso de nivel de espacio de nombres:
using std::pair; using std::string; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Declaraciones de uso de funciones locales:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using std::make_pair; return make_pair(s.begin(), s.end()); }
Función local
using namespace
:std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using namespace std; return make_pair(s.begin(), s.end()); }
¿Algo más?
Esto supone que es anterior a C ++ 14 y, por lo tanto, no se utiliza la deducción de tipo de retorno auto
.
::std::
vsstd::
sin embargo.std
Sin embargo, estoy usando sin segundo. Alguien que define un espacio de nombres estándar está pidiendo problemas (y probablemente está buscando aprovechar la ventaja que la mayoría de la gente está usandostd
y no::std
).Respuestas:
Evite usar
using
en encabezados, porque eso rompe el propósito de los espacios de nombres.Está bien usarlo en archivos fuente, pero aún así lo evitaría en algunos casos (por ejemplo
using std
).Sin embargo, si tienes espacios de nombres anidados, está bien:
fuente
using
palabra clave sin una explicación exhaustiva de por qué se utilizan espacios de nombres para empezar.using std::cout
y amigos, pero nocout
es como si ya fuera un nombre horriblemente largo.Al poner una declaración de uso en un archivo de origen, POR FAVOR, solo ingrese las cosas que necesita. Por ejemplo:
El problema aquí es que si lo haces
introduces TODAS LAS COSAS desde el estándar en el espacio de nombres global. Lo que conduce a mensajes de error muy interesantes cuando accidentalmente usa un nombre en su código que coincide con uno que no conocía en std. Si solo obtiene las cosas que desea, entonces no tendrá ese problema (o, más precisamente, el próximo programador que trabaje en su código no tendrá ese problema).
fuente
using namespace
simplemente en un ámbito de función, evitando el problema.Como indica VJovic, no lo use
using
en un archivo de encabezado.using
en un archivo de encabezado afecta a la unidad de compilación actual (el archivo .cpp) en formas que el archivo de origen puede no estar esperando.using namespace
también se debe evitar en un archivo fuente. Esto trae cada símbolo al mismo alcance que el archivo fuente. Es más claro para sus lectores lo que está haciendo si usa símbolos específicos del espacio de nombres.fuente
using namespace JoystickModule
al comienzo de un archivo .cpp queJoystickModule::
adjuntarlo a todos los objetos.using
declaración para mi propio espacio de nombres en el que estoy trabajando actualmente y todo lo demás permanece en el espacio de nombres.using SomeNameSpace::SomeSymbol
. Esto evita mover todos los símbolos del espacio de nombres al ámbito actual.Escribir
using
en encabezados es la mejor manera de crear todo tipo de errores desagradables e imposibles de depurar . No no hacer esto.Escribir
using namespace XYZ
en el archivo fuente es un poco mejor, pero aún puede causarle innumerables dolores de cabeza. La forma segura es especificar explícitamente lo que está utilizando, por ejemplousing Foo::Bar
.Digamos que tienes Bar.cpp con lo siguiente:
La función funcionó bien, hasta que un día, aparentemente sin ningún cambio de código en las clases relevantes, su comportamiento cambió: de repente,
currentIndex
siempre parece estar desactivado por uno . Al explorar los cambios recientes, no descubre cambios, ni siquiera remotamente relacionados con el código.Eventualmente descubres la causa:
tú (indirectamente) incluyes en
Foo.h
alguna parte. En los archivos para el espacio de nombres de Foo se agregó una nueva función:Que es una coincidencia inequívocamente mejor
increment(int)
que su funciónincrement(double)
, por lo que ahoraFoo::increment()
se llama a la función en suBar::someFunction()
lugar. Whoops(Y si tuviera que escribir
using
en Encabezados queusing namespace Foo
muy bien podría estar en cualquier lugar de su árbol de inclusión ...)Entonces ... No escriba ninguno
using
en Encabezados, y también tenga cuidado de escribirusing namespace
en archivos fuente.fuente