Pregunta

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 quiero o lo espero.

¿Hay alguna manera de que pueda cancelar / anular un " utilizando " declaración para evitar esto.

Tal vez ...

unusing namespace xyzzy;
¿Fue útil?

Solución

No. Pero hay una solución potencial: si encierras tu directiva de inclusión en un espacio de nombres propio, como este ...

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

... entonces los efectos de cualquier directiva que use dentro de ese encabezado se neutralizan.

Eso puede ser problemático en algunos casos. Es por eso que cada guía de estilo de C ++ recomienda encarecidamente que no coloque un " usando espacios de nombres " directiva en un archivo de encabezado.

Otros consejos

No, no puede desusar un espacio de nombres. Lo único que puede hacer es colocar el usando el espacio de nombres en un bloque para limitar su alcance.

Ejemplo:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Tal vez pueda cambiar la plantilla que se usa en sus encabezados generados automáticamente.

Puede estar atrapado usando 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

Para referencia futura: desde la versión XE hay un nuevo valor que puede #definir para evitar el temido usando el sistema de espacio de nombres; en la inclusión: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

¿Qué le parece 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 generan pero antes de que se usen?

El experimento rápido con Visual Studio 2005 muestra que puede encerrar esos encabezados en su propio espacio de nombres con nombre y luego usar lo que necesita de este espacio de nombres (pero no use Todo el espacio de nombres, ya que introduce el espacio de nombres que desea ocultar.

#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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top