c++ - tareas - ¿Hay herramientas que ayuden a organizar#incluye?
software para gestion de eventos (6)
¿Existen herramientas que ayuden a organizar los #include
s que pertenecen a la parte superior de un archivo .c o .h?
Me preguntaba porque estoy reorganizando mi código, moviendo varias definiciones / declaraciones de funciones pequeñas de un archivo largo a archivos más pequeños y diferentes. Ahora, cada uno de los archivos más pequeños necesita un subconjunto de los #include
s que estaban en la parte superior del archivo largo.
Es simplemente molesto y propenso a errores descubrir todos los #incluidos a mano. A menudo, el código se compila aunque no todos los #include
s están ahí. Ejemplo: el archivo A usa std::vector
ampliamente pero no incluye vector
; pero actualmente incluye algún otro encabezado oscuro que incluye un vector
(tal vez a través de algunos recursivos incluidos).
Desde que se hizo esta pregunta, se creó una nueva herramienta: include-what-you-use , se basa en clang, proporciona asignaciones para simular la existencia de ciertos símbolos ( unique_ptr
en la memory
, pero en realidad se define en bits/unique_ptr.h
en algunos encabezados estándar y le permite proporcionar sus propias asignaciones.
Proporciona buenos diagnósticos y reescritura automática.
He estado lidiando con este problema últimamente. En nuestro proyecto usamos C ++ y tenemos un archivo Xh y un archivo X.cpp para cada clase X.
Mi estrategia es la siguiente:
(1) Si Ah, donde se declara la clase A, se refiere a una clase B, entonces tengo que incluir el encabezado Bh Si la declaración de la clase A contiene solo el tipo * B, entonces solo necesito una declaración directa de la clase B; en Ah podría necesitar incluir a Bh en A.cpp
(2) Utilizando el procedimiento anterior, muevo la mayor cantidad posible de entradas de Ah a A.cpp. Luego trato de eliminar una inclusión a la vez y veo si el archivo .cpp aún se compila. Esto debería permitir minimizar el conjunto de archivos incluidos en el archivo .cpp, pero no estoy 100% seguro de que el resultado sea mínimo. También creo que se puede escribir una herramienta para hacer esto automáticamente. Empecé a escribir uno para Visual Studio. Me encantaría saber que existen tales herramientas.
Nota : tal vez agregar una construcción de módulo adecuada con relaciones de importación / exportación bien definidas podría ser una adición deseada para C ++ 0x. Haría la tarea de reorganizar las importaciones mucho más fácil y aceleraría mucho la compilación.
Uso los gráficos generados por doxygen / dot-graphviz para ver cómo se vinculan los archivos. Muy útil, pero no automático, tiene que revisar visualmente los gráficos, luego editar el código para eliminar las líneas innecesarias de "#include". Por supuesto, no es realmente adecuado para proyectos muy grandes (por ejemplo, más de 100 archivos), donde los gráficos se vuelven inutilizables.
VisualAssistX puede ayudarlo a saltar a la definición de un tipo. Por ejemplo, si usa una clase MyClass en su fuente, puede hacer clic en ella, elegir goto definition, y VisualAssistX abre el archivo de inclusión que contiene la definición de esta clase (posiblemente Visual Studio también puede hacer esto, pero en este momento estoy acostumbrado) a VisualAssistX, que contribuyo cada característica maravillosa a VisualAssistX :-)). Puede usar esto para encontrar el archivo de inclusión necesario para su código fuente.
PC-Lint puede hacer exactamente lo contrario. Si tiene un archivo de inclusión en su fuente que no se está utilizando, PC-Lint puede advertirle al respecto, para que sepa que el archivo de inclusión se puede eliminar de la fuente (lo que tendrá un impacto positivo en el tiempo de compilación). .
Now each of the smaller files needs a subset of the #includes that were at the top of the long file.
Hago esto usando VisualAssistX. En primer lugar compilar el archivo para ver lo que falta. Luego puede usar la función de inclusión Agregar de VisualAssistX. Así que simplemente voy y hago clic derecho en las funciones o clases que sé que necesitan una inclusión y pulsa Agregar inclusión. Vuelva a compilar un par de veces para filtrar los nuevos incluidos que faltan y se hace. Espero haberlo escrito de manera comprensible :)
No es perfecto, pero es más rápido que hacerlo a mano.