Disculpe esta tonta pregunta, pero ¿hay alguna manera de restringir las directivas using
al archivo actual para que no se propaguen a los archivos que #include
este archivo?Restringir directivas `using` al archivo actual
Respuesta
Tal vez al envolver el código que se incluirá dentro de su propio espacio de nombre podría lograr el comportamiento
que desea, ya que los espacios de nombres tienen alcance.
// FILENAME is the file to be included
namespace FILENAME_NS {
using namespace std;
namespace INNER_NS {
[wrapped code]
}
}
using namespace FILENAME_NS::INNER_NS;
y en algún otro archivo
#include <FILENAME>
// std namespace is not visible, only INNER_NS definitions and declarations
...
¡Ey, buen truco! Creo que iré por este; ¡Muchas gracias! :) – missingfaktor
No, no existe, por lo que no debe usar el uso de directivas en archivos de encabezado ni en ningún otro archivo que # incluya.
Para extender esto un poco, el preprocesador (que maneja '# include' y otros' # '-comandos) se ejecuta antes de que el compilador vea el código. La directiva 'using' y cualquier otra palabra clave estándar son procesadas por el compilador. Por lo tanto, en lo que respecta al compilador, los archivos de encabezado no son archivos separados, sino que son el código que está en cada archivo en el que están '# include''d, y por lo tanto también lo son los' que usan' directivas que puede poner en ellos. – Amber
Aah ... triste. Gracias por la respuesta de todos modos. – missingfaktor
@Rahul No es tan malo: puede (y debería), por supuesto, usar directivas 'using' en sus archivos .cpp. –
Técnicamente usted debe ser capaz de importar a algún espacio de nombres interno, y luego hacer las cosas declaradas en que visible en el espacio de nombres significado para el usuario.
#ifndef HEADER_HPP
#define HEADER_HPP
#include <string>
namespace my_detail
{
using std::string;
inline string concatenate(const string& a, const string& b) { return a + b; }
}
namespace my_namespace
{
using my_detail::concatenate;
}
#endif
#include <iostream>
#include "header.hpp"
using namespace my_namespace;
int main()
{
std:: //required
string a("Hello "), b("world!");
std::cout << concatenate(a, b) << '\n';
}
No estoy seguro si vale la pena y lo bien que juega con "búsqueda argumento dependientes".
Demasiado problemas. Pero sigue siendo un buen trabajo. Entonces, +1. :) – missingfaktor
- 1. Uso de directivas ordenadas incorrectamente
- 2. Restringir el acceso al proveedor de contenido
- 3. ¿Cómo restringir mi aplicación al modo horizontal?
- 4. Herencia privada usando directivas, sobrecargas?
- 5. OpenMP ¿Varias directivas "compartidas"?
- 6. unido al contexto actual
- 7. hacer una ruta de archivo "siempre relativa al módulo actual"?
- 8. Maven: agregue una carpeta o archivo jar al classpath actual
- 9. VS 2012: Desplácese Explorador de soluciones al archivo actual
- 10. Agregar el directorio actual al classpath de un archivo JAR
- 11. ¿Cómo obtener la ruta al archivo de script InnoSetup actual?
- 12. Ruta al archivo actual depende de cómo ejecutar el programa
- 13. ¿Hay un aumento en el rendimiento al eliminar las directivas innecesarias del espacio de nombres (uso)?
- 14. Hace referencia al ensamblado actual con CompilerParameters
- 15. compilador de C# Directivas
- 16. directivas dinámicas en angularjs
- 17. Directivas de preprocesador VB.NET
- 18. defecto usando directivas en los nuevos archivos de C#
- 19. Cómo evitar que ReSharper acorte los espacios de nombres al agregar directivas?
- 20. Restringir Acceso Directo a archivo llamado por el Ajax Función
- 21. Master-detail Using ContentResolver.applyBatch()?
- 22. Restringir el acceso al contenido a usuarios registrados con PHP
- 23. CouchDb read authentication using lists
- 24. ¿Por qué debería eliminar las directivas innecesarias de C#?
- 25. Cómo probar las directivas AngularJS
- 26. Eclipse: limita las etiquetas de tarea al proyecto actual
- 27. using namespace
- 28. ¿Cuál es la de C++ equivalente al C# using
- 29. HttpURLConnection & Using A Specific Network Adapter
- 30. cómo restringir al usuario para copiar contenido web
Puede restringir el uso de directivas a un alcance que no sea de archivo, como un espacio de nombres o una función. –
Es mucho mejor no aplicar la directiva 'using' en los encabezados. –
@David: odio escribir algo así como 'std :: map>' cuando puedo escribir 'map >' . –
missingfaktor