que - C++ usando la palabra clave
using declarations c++ (4)
¿Cuál es la diferencia entre estos dos usos del uso de palabras clave:
using boost::shared_ptr;
y
using namespace boost;
El primero se llama using declaration
;
El segundo se llama using directive
.
Cotizando MSDN:
Observe la diferencia entre la directiva using y la declaración using:
La declaración de uso permite que un nombre individual sea usado sin calificación,
La directiva using permite que todos los nombres en un espacio de nombres se utilicen sin calificación.
El primero solo le permite usar el nombre shared_ptr sin el prefijo boost ::. El segundo le permite usar cualquiera y todos los nombres en el espacio de nombres de boost sin el prefijo boost ::. Algunas personas fruncen el ceño en este último, pero nunca me ha dado ningún problema.
using boost::shared_ptr;
Incluye solo el shared_ptr
del espacio de nombres boost
en su espacio de nombres actual. Esto significa que puede usar shared_ptr
sin calificarlo con el boost
espacio de nombres.
Se llama una declaración de uso .
using namespace boost;
Incluye todos los símbolos en el espacio de nombres de boost
en su ámbito actual. Esto significa que puede usar todos los símbolos en el espacio de nombres de boost
sin calificarlos con el boost
espacio de nombres.
Se llama como usar directiva .
¿Por qué debería preferir siempre using declaration
en lugar de using directive
?
Siempre es mejor usar el primero ( using declaration
) y evitar el segundo ( using directive
) porque el segundo causa la contaminación del espacio de nombres al traer un número potencialmente grande de nombres al espacio de nombres actual, muchos de los cuales son innecesarios. La presencia de los nombres innecesarios aumenta considerablemente la posibilidad de conflictos de nombres no deseados.
Para citar a Herb Sutter
sobre el uso de la using directive
:
Me parece útil pensar en una using directive
como un ejército merodeador de bárbaros enloquecidos que siembran la destrucción indiscriminada dondequiera que pase, algo que por su mera presencia puede causar unintended conflicts,
incluso cuando crees que estás aliado.
-
using namespace boost
hace que todos los nombres en el espacio de nombres deboost
visibles sin calificación -
using boost::shared_ptr
solo hace queshared_ptr
sea visible sin calificación.