2009-07-12 14 views
7

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

16

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; 
} 
+0

No lo sabía, esto resuelve mi problema –

+0

No, lamentablemente, no :(g ++ no lo admite. –

+0

Es extraño escuchar eso. t es estándar. –

15

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 :-)

+0

+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

+13

Para espacios de nombres más largos puede usar 'namespace fs = boost :: filesystem', y luego referirse a' boost :: filesystem :: path' escribiendo 'fs :: path'. – dalle

4

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!

+0

¿De qué manera la eliminación del espacio de nombres aumenta la legibilidad? Creo que simplemente pierde información ... – GManNickG

+7

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

+2

Eso es estúpido. – GManNickG

6

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.
4

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.

+1

Tiene solo 5 caracteres, pero se acumula: boost :: shared_ptr >> payment_periods; –

+4

Yo usaría typedefs para ese caso typedef std :: pair period; typedef std :: vector periodos; boost :: shared_ptr payment_periods; –

1

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 ::".

0

Yo uso using namespacesolo 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).

Cuestiones relacionadas