En mi código C++ no uso las declaraciones using namespace std;
o using namespace boost;
. Esto hace que mi código sea más largo y significa más tipeo. Estaba pensando en comenzar a usar las declaraciones de "uso", pero recuerdo a algunas personas que argumentaban en contra de eso. ¿Cuál es la práctica recomendada? std y boost son tan comunes que no debería haber mucho daño en eso?¿Debo usar los prefijos std :: y boost :: en todas partes?
Respuesta
Uso using namespace
solo en archivos C++, no en encabezados. Además, el uso del espacio de nombres del agujero no es necesario en la mayoría de los casos. Por ejemplo, puede escribir using boost::shared_ptr
o using std::tr1::shared_ptr
para cambiar fácilmente entre las implementaciones shared_ptr
.
muestra:
#include <iostream>
using std::cout;
int main()
{
cout << "test" << std::endl;
return 0;
}
Using namespace ...
no se inventó solo por diversión.
Si tiene un buen motivo para usarlo, hágalo (y el uso frecuente de elementos de estos espacios de nombres es la buena razón). No escuche a los fanáticos que le dicen todo lo que no quieren hacer por razones oscuras que ellos mismos son malvados.
Sin embargo, una buena fuente para el razonamiento en estos aspectos es C++ FAQ Lite: http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5
He leído y todavía decidido usarlo como desea. Ahora puede tomar su propia decisión informada :-)
+1 para el enlace a las preguntas frecuentes. Personalmente, escribo el prefijo 'std ::'. Solo cuando la tediosidad es demasiado alta (es decir, el espacio de nombres 'boost :: filesystem') escribo' using namespace', pero solo dentro de una definición de función, nunca en el alcance del archivo. – avakar
Para espacios de nombres más largos puede usar 'namespace fs = boost :: filesystem', y luego referirse a' boost :: filesystem :: path' escribiendo 'fs :: path'. – dalle
El hecho de que el código esté saturado con :: std :: prefixes es realmente molesto al leer el código. Sin embargo, desea saber en qué espacio de nombres estaba un símbolo lo más fácilmente posible ...
¿Ahora no es ese el trabajo del IDE?
Siempre que mi IDE no admita 'ver nombres cortos', me inclino por las declaraciones using
para los símbolos comúnmente conocidos (es decir, STL, boost, ...). ¡Readibility primero!
¿De qué manera la eliminación del espacio de nombres aumenta la legibilidad? Creo que simplemente pierde información ... – GManNickG
Inglés: cuando inglés: inglés: repetir inglés: inglés: mismo inglés: inglés de cosas: todo inglés: inglés: tiempo inglés: inglés: solo inglés: inglés: ruido. – dave4420
Eso es estúpido. – GManNickG
Mis propias reglas son:
- en los archivos de cabecera, todos los nombres son explícitamente calificada por ejemplo,
std::string
,std::cout
etc. en su punto de uso - en archivos de origen, coloque las cláusulas de uso para los nombres utilizados comúnmente en la parte superior del archivo, por ejemplo. usando
std::string;
- nunca use
using namespace xxxx;
en el código de producción.
Un factor a tener en cuenta es que el espacio de nombre std
se denomina de esta manera para abreviarlo. Un prefijo std::
tiene solo 5 caracteres, apenas el fin del mundo. Eso es diferente a los espacios de nombres de .NET como System.Collections.Generic
. Está diseñado para ser fácil de escribir.
Por esa razón, generalmente escribo el prefijo std
. Boost tampoco está mal, así que generalmente también escribo eso.
lo general alias de los sub-espacios de nombres (boost::filesystem
por ejemplo) para algo más corto (por ejemplo) namespace fs = boost::filesystem
Uso typedefs generosamente ayuda también. Y si necesito hacer referencia a un tipo con frecuencia, podría agregarle un using
.
Pero generalmente trato de evitar using
en los encabezados especialmente, y cuando los uso, prefiero ponerlos en el alcance de la función para evitar contaminar el espacio de nombres real.
C++ ofrece una gran cantidad de herramientas que le permiten evitar tener que especificar el espacio de nombres, sin contaminar el espacio de nombres global.
Tiene solo 5 caracteres, pero se acumula: boost :: shared_ptr
Yo usaría typedefs para ese caso typedef std :: pair
En archivos de encabezado, sí. Eso es porque usa "using std :: name_of_std_member;" o usando "using namespace std;" en un archivo de encabezado provocará que todos los demás archivos que incluyen ese archivo de encabezado vean el símbolo en el ámbito global, lo que anulará el propósito de los espacios de nombres. En los archivos fuente, sin embargo, está perfectamente bien usar "using namespace std;" para hacer que los símbolos de ese espacio de nombres estén disponibles con el prefijo "std ::".
Yo uso using namespace
solo dentro de los cuerpos de función. En archivos de encabezado, siempre califico explícitamente el espacio de nombres.
Raramente (cuando copio pegando el código de un colega para maqueta), uso using namespace
en el ámbito del espacio de nombres (es decir, para toda la unidad de traducción).
- 1. usando partes de Boost
- 2. ¿Debo usar los prefijos get_/set_ en los nombres de métodos de Python?
- 3. boost zip_iterator y std :: sort
- 4. Ocultar cursor en todas partes
- 5. ¿Debo verificar boost :: shared_ptr o std :: shared_ptr antes de usarlo?
- 6. ¿Debo usar boost :: ptr_vector <T> o vector <boost :: shared_ptr <T>>?
- 7. Interoperabilidad entre boost :: date_time y std :: chrono
- 8. ¿Es posible usar boost :: foreach con std :: map?
- 9. ¿Es seguro usar std :: bind con boost :: signals2?
- 10. Cómo usar boost :: lambda junto con std :: find_if?
- 11. Android OpenGL ES ¿Soporte en todas partes?
- 12. ¿Por qué "android:" en todas partes?
- 13. WordPress con phpMyAdmin - 404 en todas partes
- 14. Boost equivalente a std :: async()
- 15. ¿Cuándo debo usar los hilos?
- 16. ¿Debo usar std :: move o std :: forward en movimiento ctors/operadores de asignación?
- 17. Qt :: WA_TranslucentBackground disponible en todas partes?
- 18. ¿Usar prefijos específicos de elemento y autonumber para claves primarias?
- 19. ¿Cuándo debo usar dispose() en los gráficos?
- 20. Boost Asio en Linux sin usar Epoll
- 21. ¿Debo usar HTML5 y CSS3?
- 22. error de vinculador al usar Qt y Boost
- 23. boost :: ifind_first con std :: string objects
- 24. contenedor stl con std :: unique_ptr's boost :: ptr_container
- 25. ¿Por qué hay una diferencia al usar std :: thread :: hardware_concurrency() y boost :: thread :: hardware_concurrency()?
- 26. JPA (Hibernate) y prefijos de tabla personalizados
- 27. Cómo usar boost :: unit_test?
- 28. Cómo usar std :: foreach con los parámetros/modificación
- 29. ¿Cómo puedo cambiar los prefijos en todas las tablas de mi base de datos MySQL?
- 30. Concatenate boost :: dynamic_bitset o std :: bitset
No lo sabía, esto resuelve mi problema –
No, lamentablemente, no :(g ++ no lo admite. –
Es extraño escuchar eso. t es estándar. –