Uno de los caprichos de mi sistema de desarrollo (Codegear C ++ Builder) es que algunos de los encabezados generados automáticamente insisten en tener ...
using namespace xyzzy
... declaraciones en ellos, que impactan en mi código cuando menos lo deseo o lo espero.
¿Hay alguna manera de que de alguna manera pueda cancelar / anular una declaración anterior de "uso" para evitar esto?
Tal vez...
unusing namespace xyzzy;
c++
namespaces
c++builder
Roddy
fuente
fuente
Respuestas:
No Pero hay una solución potencial: si adjunta su directiva include en un espacio de nombres propio, como este ...
namespace codegear { #include "codegear_header.h" } // namespace codegear
... entonces se neutralizan los efectos de cualquier directiva using dentro de ese encabezado.
Eso puede resultar problemático en algunos casos. Es por eso que cada guía de estilo de C ++ recomienda encarecidamente no poner una directiva de "uso de espacio de nombres" en un archivo de encabezado.
fuente
No, no puede deshacer el uso de un espacio de nombres. Lo único que puede hacer es
using namespace
bloquear la declaración -enunciado para limitar su alcance.Ejemplo:
{ using namespace xyzzy; } // stop using namespace xyzzy here
Tal vez pueda cambiar la plantilla que se utiliza en sus encabezados generados automáticamente.
fuente
Es posible que se quede atascado al usar espacios de nombres explícitos en 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
fuente
Para referencia futura: desde la versión XE hay un nuevo valor que puede # definir para evitar el temido
using namespace System;
int el include: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USEfuente
¿Qué tal usar 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 generen pero antes de que se utilicen?
fuente
Un experimento rápido con Visual Studio 2005 muestra que puede incluir esos encabezados en su propio espacio de nombres con nombre y luego
use
lo que necesita de este espacio de nombres (pero no enuse
todo el espacio de nombres, ya que presentará el espacio de nombres que desea ocultar.fuente
#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); }
fuente