Cuando se utilizan espacios de nombres anidados, a veces los nombres totalmente calificados terminan siendo bastante largos. Sé que puedo usar namespace abc = aaa::bbb::ccc
para reducir la cantidad de tipeo (también puede mejorar la legibilidad en algunos casos).Enfoque coherente para cambiar el nombre de espacios de nombres en C++
No estoy seguro, sin embargo, cuál es la mejor manera de lograr este cambio de nombre en todos los archivos de un proyecto. El enfoque directo (es decir, para cambiar el nombre de los espacios de nombres largos por usuario) podría llevar a utilizar diferentes nombres cortos para el mismo nombre completo en archivos diferentes. Entonces, estaba pensando en encontrar una forma más consistente de hacer esto.
Por ejemplo, vamos a suponer algo como:
project
|- client
| |- core
| |- plugin
| |- util
|- server
...
estaba pensando para crear un encabezado por directorio que incluye los nombres reducidos. Por ejemplo, project/client/core/core.h
contendría namespace pr_cl_core = project::client::core
(sé que el ejemplo para este nombre corto es bastante pobre, pero en proyectos reales tienen más sentido). Luego, incluiría core.h
en todos los archivos de encabezado en project/client/core
, de modo que cuando se incluye un encabezado de ese directorio en, digamos, project/client/plugin/plugin_foo.h
, las versiones cortas del espacio de nombres estén disponibles.
¿Es este un buen enfoque para hacerlo? ¿Hay alguna otra forma mejor?
He encontrado varias preguntas sobre espacios de nombres C++ en SO (por ejemplo, 1 y 2), pero ninguna de ellas se relaciona con la forma de resolver el cambio de nombre del espacio de nombre en todo el proyecto.
EDIT: Además, un mecanismo de este tipo se podría utilizar para cambiar el nombre sistemáticamente de espacios de nombres largos (como los de Boost) para un proyecto completo. Por ejemplo, normalmente cambiar el nombre de algunos espacios de nombres como:
namespace ip = boost::asio::ip;
namespace ptime = boost::posix_time;
Actualmente hago esto sobre una base per-traducción unidad, pero me gustaría hacerlo mediante una estrategia global para todo el proyecto.
Podría hacerlo, o podría hacerlo aún más simple: tener un encabezado en el nivel superior que declara prototipos para todos los espacios de nombres y los alias. Entonces solo incluye eso en los subdires. – Linuxios
@Linuxios Estaba pensando algo así también, pero puede terminar presentando muchas dependencias: si cambiara ese archivo global, prácticamente todos los archivos del proyecto tendrían que volver a compilarse. Dicho eso, si la estructura de los espacios de nombres no cambia demasiado, no debería ser un problema importante. – betabandido
@betabendido: Ah. ¿Qué pasa con la solución rápida y sucia? ¡Macros de preprocesador! Simplemente declare en cada archivo sus alias. De esta forma, cada archivo puede tener sus propios alias. Sí, la gente gritará por la duplicación del código, pero siempre puedes agregar un script de compilación para hacerlo por ti ... – Linuxios