Estoy escribiendo una biblioteca con varias módulos dependientes. Cuando me incluir un archivo de un módulo diferente, debo resolver el espacio de nombres con:

using namespace project1::namespace1;
class1 obj;

o

typedef project1::namespace1::class1 class1;
class1 obj;

¿Cuáles son los pros y los contras de cada enfoque? Leí en alguna parte que debemos de utilizar typedef en .H archivos y using en .C archivos, es esto recomendable?

Uno de los problemas que me he encontrado con «typedef» es que conduce a un espacio de nombres de ambigüedad, si tengo que incluir tanto el original de la clase y la clase con «typedef» en un tercer módulo.

  • Una alternativa es using project1::namespace1::class1;
  • «Depende». No hay una sola respuesta correcta.
  • Gracias. Podría por favor elaborar?
  • C++ no tiene un diseño coherente de la estructura, ya que añade su propia cuenta, poco a poco a lo largo del tiempo, en la parte superior de C. por Lo tanto, tiene tanto » con » y «typedef», y para el caso de un solo elemento, que son bastante difíciles de distinguir en la utilidad.
  • «debemos usar» typedef » en .H archivos y ‘utilizar’ en .C archivos» – no estoy de acuerdo con el uso de un conjunto de nombres en una .h archivo ya que significa que usted está contaminando el espacio de nombres global con las cosas de la .c archivo no puede esperar. El .c archivo de su propia unidad de compilación y puede hacer lo que quiera. Sin embargo creo que hmjd solución es mejor que un typedef.
InformationsquelleAutor vid | 2012-04-26

4 Comentarios

  1. 74

    Las dos opciones que el estado no son equivalentes. Este:

    using namespace project1::namespace1;

    tira en todo desde el espacio de nombres, que le da poco el control y la fabricación de los enfrentamientos probable. Yo sólo veo contras, y no pros aquí.

    Pero usted no necesita utilizar un typedef a traer en un solo símbolo, puede utilizar

    using project1::namespace1::class1;

    Si usa el typedef no hacer demasiado de una diferencia. Pero ten en cuenta que typedef está limitado a los tipos y las enumeraciones, mientras que using puede hacer referencia a los valores, funciones, etc:

    namespace X {
      const int x{42};
      enum Fruit{Apple, Pear};
    }
    
    using X::x; //OK
    typedef X::x xx; //Error! 'x' in namespace 'X' does not name a type

    de modo que las dos expresiones no son completamente equivalentes.

    • Suena bien. Esto también evitar la ambuiguity de los temas mencionados en la pregunta.
    • En realidad, Buena respuesta.
  2. 10

    Usted nunca debe utilizar using o typedef en un archivo de encabezado sólo por el bien de los nombres más fácil escribir.

    En el archivo de origen, le toca a usted. Parece ser que se considera una buena práctica escribir el nombre completo, como deja muy claro lo que significaba. Si el espacio es demasiado largo, puede utilizar un espacio de nombres de alias para reducir el desorden, pero todavía se mantenga el significado claro: namespace ns = project1::namespace1;

    De cualquier manera, si usted va a importar símbolos en el espacio de nombres global, el uso de using, no typedef. typedef se utiliza principalmente cuando se desea llamar, el tipo por un nombre diferente, muchas veces porque es una plantilla – por ejemplo, my_map en lugar de std::map<std::string, my_type>, que está todavía claro, pero se ve mucho mejor para escribir.

    También, ver a esta pregunta: ¿Por qué es «using namespace std» considera una mala práctica?

    • nunca use typedef en un encabezado? En serio? -1 . Es una práctica estándar para typedef varios tipos para ser utilizados en el resto de la aplicación, y poner a todos en una sola cabecera. Los ejemplos incluyen Uint8 en libsdl, y quint16 en Qt 4.
    • parkovski frunce el ceño a abreviar entrante tipos de locales de uso dentro de la cabecera. Utilizando las definiciones de tipos para definir su expuestos API es totalmente diferente y aceptar.
    • Tanto «los patrones de uso de» usted ha mencionado son idénticos y representar la misma cosa – que hacen cabecera central, y el uso de los tipos declarados en dicho encabezado. Si es para «importar»/»exportación» es irrelevante. parkovski sugerencias suena razonable, porque hay muchos lugares en *.h donde usted puede colocar typedef – que usted puede incluir en su clase, espacio de nombres, etc., lo que es seguro. También, typedef no causar un desastre. Así que no importa cómo se mire, «no typedef en *.h» suena como un inútil la restricción artificial de un estilo de codificación – no hay beneficios, por lo que esta regla no debe ser utilizado.
    • Creo que no has leído el resto de la frase. Estándar de C tiene un montón de definiciones de tipos en los encabezados que son muy útiles (size_t, ptrdiff_t por ejemplo). La diferencia es que esos son parte de la API que sirve a un propósito específico, no sólo un acceso directo para alguien «porque yo no liek 2 tipo».
  3. 6

    La manera más clara es no utilizar ninguno de estos métodos – sólo tiene que escribir new project1::namespace1::class1().

    • Que es como tal vez, pero se pone un poco detallado, a veces, no?
  4. 3

    uso using project1::namespace1::class1

    O, usted puede limitar el uso de namespce en un ámbito local, tanto para su conveniencia y no polute el espacio de nombres global.

    void function()
    {
        using namespace project1::namespace1;
    
        class1 obj;
    
        ...
    }

Dejar respuesta

Please enter your comment!
Please enter your name here