C++Espacios de nombres


Introducción

Utilizado para evitar colisiones de nombres cuando se usan bibliotecas múltiples, un espacio de nombres es un prefijo declarativo para funciones, clases, tipos, etc.

Sintaxis

  • identificador de espacio de nombres ( opt ) { declaración-seq }
  • identificador de espacio de nombres en línea ( opt ) { declaraciones-seq } / * desde C ++ 11 * /
  • inline ( opt ) namespace atributo-specifier-seq identifier ( opt ) { declaraciones-seq } / * desde C ++ 17 * /
  • espacio de nombres adjuntando-espacio de nombres-especificador :: identificador { declaración-seq } / * desde C ++ 17 * /
  • identificador de espacio de nombres = calificador de espacio de nombres calificado ;
  • usando el espacio de nombres nombre-anidado-especificador ( opt ) nombre-espacio-nombres ;
  • atributo-especificador-seq usando el espacio de nombres nombre-anidado-especificador ( opt ) nombre-espacio-nombres ; / * desde C ++ 11 * /

Observaciones

El namespace palabras clave tiene tres significados diferentes según el contexto:

  1. Cuando le sigue un nombre opcional y una secuencia de declaraciones encerrada en corchetes, define un nuevo espacio de nombres o amplía un espacio de nombres existente con esas declaraciones. Si se omite el nombre, el espacio de nombres es un espacio de nombres sin nombre .

  2. Cuando le sigue un nombre y un signo igual, declara un alias de espacio de nombres .

  3. Cuando está precedido por el using y seguido de un nombre de espacio de nombres, forma una directiva de uso , que permite encontrar los nombres en el espacio de nombres dado por búsqueda de nombre no calificado (pero no vuelve a declarar esos nombres en el ámbito actual). Una directiva de uso no puede ocurrir en el alcance de la clase.

using namespace std; se desanima ¿Por qué? Porque namespace std es enorme! Esto significa que hay una alta probabilidad de que los nombres colisionen:

//Really bad!
using namespace std;

//Calculates p^e and outputs it to std::cout
void pow(double p, double e) { /*...*/ }

//Calls pow
pow(5.0, 2.0); //Error! There is already a pow function in namespace std with the same signature,
               //so the call is ambiguous

Espacios de nombres Ejemplos relacionados