2008-10-03 17 views
64

Uno de los caprichos de mi sistema de desarrollo (Codegear C++ Builder) es que algunos de los encabezados generados automáticamente insisten en tener ...¿Cómo puedo "dejar de usar" un espacio de nombres?

using namespace xyzzy 

... declaraciones en ellos, lo que impacto en mi código cuando menos lo quiero o lo espero.

¿Hay alguna forma en que de alguna manera puedo cancelar/anular una instrucción "using" anterior para evitar esto?

Tal vez ...

unusing namespace xyzzy; 
+2

probablemente debería abrir un informe de error con su sistema de control de calidad: http://qc.codegear.com/ –

+1

BTW, ¿qué encabezados generados automáticamente son estos? –

+0

Un día C++ tendrá módulos, e incluir código en otro código tendrá mejores construcciones de encapsulación. Hasta entonces, no hay una manera fácil de evitar esto. Considere poner su propio código en un espacio de nombres y referirse a él de esa manera. –

Respuesta

45

No. Pero hay una posible solución:. si se encierra a su directiva include en un espacio de nombres propios, así ...

namespace codegear { 
    #include "codegear_header.h" 
} // namespace codegear 

... luego se neutralizan los efectos de las directivas que se usan dentro de ese encabezado.

Eso podría ser problemático en algunos casos. Es por eso que cada guía de estilo C++ recomienda encarecidamente no poniendo una directiva "using namespace" en un archivo de encabezado.

+0

En general, esta es una idea _terrible_. Los encabezados de C++ no están destinados a ser incluidos en un espacio de nombres alternativo como se utilizó aquí. – Aaron

+17

Es una idea terrible incluir una directiva de uso también en un archivo de encabezado. Esto simplemente mitiga ese problema. –

+3

Colocar el encabezado en su propio espacio de nombres no es una solución, ya que cambia el significado de las declaraciones en esa biblioteca. (-1) –

37

No, no puede unuse un espacio de nombres. Lo único que puede hacer es poner un using namespace -statement a block para limitar su alcance.

Ejemplo:

{ 
    using namespace xyzzy; 

} // stop using namespace xyzzy here 

Tal vez usted puede cambiar la plantilla que se utiliza de sus cabeceras generadas automáticamente.

+0

¿Puedes envolver una inclusión en un bloque como este sin embargo? – Eclipse

+0

Sí, esto no con el código generado automáticamente. Byt mybe él puede cambiar la plantilla para el código generado automáticamente? –

+0

Sí, esto realmente no resuelve el problema que está teniendo de los encabezados que usan espacios de nombres. – Kip

1

Experimento rápido con Visual Studio 2005 muestra que puede encerrar esos encabezados en su propio espacio de nombres y luego use lo que necesita de este espacio de nombres (pero no use el espacio de nombres completo, ya que introducirá el espacio de nombres que desee ocultar

+1

Esto probablemente provocará problemas de creación de nombres si los archivos de encabezado son declaraciones para una biblioteca. La compilación tendrá éxito, pero el enlazador no podrá encontrar las definiciones, ya que ya se habrían compilado en un espacio de nombres diferente. – Eclipse

12

usted puede ser atrapado usando espacios de nombres explícitos sobre los conflictos:.

string x; // Doesn't work due to conflicting declarations 
::string y; // use the class from the global namespace 
std::string z; // use the string class from the std namespace 
7

¿Qué le parece usar el sed, perl o alguna otra herramienta de línea de comandos como parte de su proceso de compilación para modificar los encabezados generados después de que se generan pero antes de que se utilicen?

+0

En caso de que haya muchos encabezados, esto puede ser demasiado lento – doc

+3

sed más lento que el generador de código? Difícil de creer ... – Arkadiy

8

Para futuras referencias: desde la versión XE hay un nuevo valor que se puede #define para evitar la temida using namespace System; int el include: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

+3

Bien, gracias. Tal vez no debería haber cancelado SA después de todo ... – Roddy

+0

Pero parece que esto no funciona correctamente. Al menos en todos los casos lo intenté (con BCB6). Luego solía volver a agregar espacios de nombres explícitos en el conflicto y, lo que era peor, incluía un encabezado para evitar conflictos de nombres de tipos ... – Wolf

-1
#include<iostream> 
#include<stdio.h> 
namespace namespace1 { 
    int t = 10; 
} 
namespace namespace2 { 
    int t = 20; 
} 
int main() { 
using namespace namespace1; 
    printf("%d" , t); 
    printf("%d" , namespace2::t); 
} 
+0

¡por favor explique su respuesta! – Mazz

+0

puede usar el operador de resolución de alcance para usar otra variable de espacio de nombres –

+1

No aborda la pregunta –

Cuestiones relacionadas