2010-08-02 14 views
6

He observado que en C++ los espacios de nombres se usan muy raramente mientras que en .Net es muy común. Hay una razón en particular para esto.Namespaces y C++

También me gustaría saber si otros han visto espacios de nombres utilizados comúnmente en C++.

EDIT: En realidad me refiero a aplicaciones personalizadas y no como bibliotecas estándar STL o cualquier otra cosa.

+6

Me pregunto qué código estás viendo. Todo lo que hago, excepto el "código principal", está en un espacio de nombres. – GManNickG

+0

@GMan: Bueno, como un ejemplo, [a Scott Meyers no le interesan demasiado] (http://groups.google.com/group/comp.lang.c++moderated/msg/f7e901ce6e8a86c0) (o, en al menos no lo hizo en el momento en que escribió eso, hace nueve años). –

+3

Meyers no se quejaba de los conceptos de espacio de nombres, solo acerca de los compromisos (búsqueda de Koenig) necesarios para actualizarlos en el lenguaje. –

Respuesta

10

En C++, se añadieron los espacios de nombres de la lengua algún tiempo después de la aplicación inicial, por lo que no era el código de aplicación tanto que no hizo uso de ellos. Entonces, también debido a su adición tardía, toda la biblioteca estándar se puso en un espacio de nombres. Por lo tanto, con un simple using namespace std; podría ignorar los espacios de nombres si quisiera.

En C#, por el contrario, los espacios de nombres estaban involucrados desde el principio, y la biblioteca se dividió a lo largo de un gran número de ellos. Además, todos los asistentes que usan para crear su código inicial, colocan las clases en un espacio de nombre por defecto. Esto forzó una mayor conciencia de los espacios de nombres.

-1

El Boost C++ libraries usa espacios de nombres extensamente.

+0

¿Por qué votar abajo? –

+0

No respondió la pregunta. – zgnilec

3

He observado que en los espacios de nombres de C++ se utilizan muy raramente

¿Sería capaz de respaldar eso con los empíricos relevantes? Boost, Qt, STL, ... todos usan espacios de nombres.

+1

Muchos, muchos nombres en Qt están en el espacio de nombres global ... – jpalecek

+1

@Jpalecek: Sin embargo, muchos no lo son. El punto que se está haciendo es que Qt usa espacios de nombres extensamente. –

+0

@Martin York: Hice un 'nm -DC/usr/lib/libQtCore.so' en mi sistema Debian, y busqué nombres que no estuvieran en el espacio de nombres global. No hay ninguno, lo mismo aplica para 'libQtGui.so' y' libQtNetwork.so'. Esto no es lo que yo llamo "uso extensivo". De hecho, Qt API contiene muy pocos espacios de nombres en áreas bastante secundarias, además de que hay algunos espacios de nombres como detalles de implementación. – jpalecek

0

De trabajar en 5 lugares diferentes puedo decir que 2 de los 5 espacios de nombres usados ​​antes de unirme.

supongo que los espacios de nombres en C++ no se acostumbra tanto (como debe ser?) Se debe a la sintaxis de ser cludgy.

es decir: Quiero escribir esto:

namespace xml::xmpp::core { }

Pero en vez tener que escribir esto:

namespace xml { namespace xmpp { namespace core { } } }

Y para reenviar declarar, me gustaría escribir:

class xml::parser;

Pero tienen que escribir

namespace xml { class parser; }

Pero puede escribir:

using namespace xml::xmpp::core;

En otro orden de cosas, ¿alguien puede decir a mi qué clases tienen que ser terminada por un punto y coma pero cualquier otra cosa (funciones, espacios de nombres) no?

+1

Eso último merece su propia pregunta, pero es porque puedes declarar una variable. Hay dos partes opcionales para una declaración de clase, la definición (si se omite, tiene una declaración directa) y la lista de variables. Eche un vistazo a algún viejo código C que typedefs cada estructura para ver lo que quiero decir. –

+0

bien. Aunque me molesta. –

+0

namespace xml {class parser; } clase xml {class parser {...}; }; clase xml :: analizador; // ¿Qué xml :: parser es este predecesor? –

7

Los espacios de nombre en C++ no son los mismos en absoluto que en .Net, ActionScript y Java (que comparten el mismo concepto). No son el mismo concepto en absoluto.

En C++, los espacios de nombres están allí principalmente para permitir la encapsulación de varios tipos y funciones en un contexto con nombre, el espacio de nombres. Solo se trata de nombrar y acceder a los nombres.

En .Net, ActionScript y Java, los espacios de nombres son más sobre módulos que nombres. Obligan al desarrollador a organizar su código en espacios de nombres separados que tratan cada uno de un propósito, el contexto. Como esos lenguajes son dinámicos (en lugar de estáticos como C++), los espacios de nombres permiten la vinculación tardía de los tipos al código, lo que hace que la compilación sea rápida porque solo debe tener el nombre canónico (nombre y espacio de nombres) del tipo que desea utilizar en un archivo .

En C++ no hay comandos de módulo, solo unidades de compilación que no se conocen entre sí.

Ahora, sobre su uso, a menudo es una buena práctica usar un espacio de nombres en C++ para encapsular un módulo (ejecutable o dll/so), algún código de implementación o cualquier subparte útil del código. Eso dice que la mayoría de las veces es mejor no tener una jerarquía de espacios de nombres demasiado profunda. Por razones históricas, muchos desarrolladores de C++ ni siquiera sabían por mucho tiempo que C++ tenía una característica llamada espacio de nombres. Ahora, lo que llamamos "C++ moderno" sugiere que usted lo sepa, pero todavía se usa mucho código antiguo de C++ y tal vez eso es lo que está viendo cuando habla de espacios de nombres.

Los espacios de nombres en C++ son una característica diferente que en otros idiomas, lo que hace que su escritura sea más o menos aparente en el código. De hecho, es tan diferente que no lo administrarás del mismo modo, lo que hace que el código sea realmente difícil de entender cuando vienes de .Net. Así que no debería tomar espacios de nombres de la misma manera entre los idiomas, son conceptos realmente diferentes.

+2

"En .Net, ActionScript y Java, los espacios de nombres son más sobre módulos que nombres." Esto es definitivamente inexacto con respecto a .net. Los miembros de un espacio de nombre se pueden definir en ensamblados múltiples, y un ensamblaje puede contener definiciones en varios espacios de nombres. De hecho, es muy similar a cómo funcionan los espacios de nombres en C++. Java es ligeramente diferente ya que los espacios de nombres informan las ubicaciones del sistema de archivos .class de forma predeterminada (ignorando jarras por el momento) pero incluso entonces, la unidad del módulo es la clase, no el espacio de nombres y diferentes "proveedores" pueden proporcionar clases en el mismo espacio de nombres –

+0

"modules" aquí no se relaciona directamente con assembly o .jar sino con "systems" - una clase, varias clases, un jar, etc. Dicho eso, gracias por la precisión. – Klaim

2

La respuesta más simple sería que cuando inicia un programa en Visual Studio (2003 y más adelante) crea namespaces de forma predeterminada. Otros (IDE) más antiguos no, supongo.

.NET lo ha alentado desde el principio. Los espacios de nombres no siempre formaban parte de la implementación original en C++. Ha ganado tracción con .Net.

0

Los espacios de nombres son tu mejor amigo en proyectos grandes.

Visto o no - no importa. Abrace el hábito de usarlos.

0

A medida que pasa el tiempo, veo cada vez más códigos C++ que hacen un uso cuidadoso de los espacios de nombres. Es posible que haya estado observando los efectos persistentes del estilo de programación c-con-clases ...

Tenga en cuenta que soy físico y la mayoría del código que miro fue escrito por otros físicos, por lo que este podría ser un artefacto de mi dominio.

0

Una razón es que algunos compiladores populares (gcc en particular) agregaron soporte para espacios de nombres bastante tarde, y para ser más portátiles, muchos proyectos se iniciaron sin espacios de nombres. Por supuesto, para un nuevo proyecto, no usar espacios de nombres sería extraño.