2010-09-04 11 views
23

¿Hay alguna herramienta que ayude a organizar el #include s que pertenecen a la parte superior de un archivo .c o .h?¿Existen herramientas que ayuden a organizar #includes?

Me preguntaba porque estoy reorganizando mi código, moviendo varias pequeñas definiciones de funciones/declaraciones de un archivo largo en diferentes archivos más pequeños. Ahora, cada uno de los archivos más pequeños necesita un subconjunto de los #include que estaban en la parte superior del archivo largo.

Simplemente es molesto y propenso a errores averiguar todos los #includes a mano. A menudo, el código se compila aunque no todos los #include están ahí. Ejemplo: el archivo A usa std::vector extensamente pero no incluye vector; pero actualmente incluye algún otro encabezado oscuro que incluye vector (quizás a través de algunas recursivas).

+0

Encontré una discusión de este problema en el sitio Eclipse CDT: http://wiki.eclipse.org/CDT/C_editor_enhancements/Include_management – Frank

Respuesta

1
+0

Buena idea, pero probablemente no es exactamente lo que necesito. Me gustaría una herramienta que me diga qué debo incluir, incluso si aún no he agregado una sola inclusión (makedepend y amigos darían un error en ese caso). Eclipse hace eso para Java (¿también para C++?). Además, makedepend me dice las dependencias para cada unidad de compilación (archivo '.o'), pero no lo que debe incluir un cierto archivo de encabezado. – Frank

+3

Creo que el problema cuando lo planteas es inviable. Por ejemplo, puedo ejecutar un programa que me dice que 'EOF' no está definido en' foo.c'. También puedo determinar mecánicamente que EOF se define en 'libio.h',' stdio.h' y (por ejemplo) 'foo.h'. ¿Qué incluyo? – msw

+4

presenta un punto válido. Sin embargo, una herramienta aún puede hacer sugerencias, en función de qué encabezados están presentes en la ruta de inclusión, y quizás incluso cuáles son estándar (o populares). –

2

VisualAssistX puede ayudarle a saltar a la definición de un tipo. P.ej. si utiliza una clase MyClass en su fuente, puede hacer clic en ella, elegir la definición goto y VisualAssistX abre el archivo include que contiene la definición de esta clase (posiblemente Visual Studio también puede hacerlo, pero en este punto me estoy acostumbrando a VisualAssistX, que aporto todas las funciones maravillosas 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 incluido en su fuente que no se está utilizando, PC-Lint puede advertirlo, para que sepa que el archivo incluido se puede eliminar de la fuente (lo que tendrá un impacto positivo en el tiempo de compilación) .

0

Uso los gráficos generados doxygen/dot-graphviz para ver cómo están vinculados los archivos. Muy práctico, pero no automático, debe verificar visualmente los gráficos, luego edite su código para eliminar las líneas innecesarias "#include". Por supuesto, no es realmente adecuado para proyectos muy grandes (digamos> 100 archivos), donde los gráficos se vuelven inutilizables.

1

He estado lidiando con este problema últimamente. En nuestro proyecto el uso de C++ y tienen un archivo de Xh y uno X.cpp para cada clase X.

Mi estrategia es la siguiente:

(1) Si Ah, si se declara la clase A, se refiere a una clase B, luego 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 clase B; en A.h. Que podría necesitar incluir B.h en a.cpp

(2) Utilizando el procedimiento anterior, I mover tantas incluye como sea posible de A.h a a.cpp. Luego trato de eliminar uno a la vez y ver 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 si el resultado es mínimo. También creo que uno puede escribir una herramienta para hacer esto automáticamente. Empecé a escribir uno para Visual Studio. Me alegraría saber que hay tales herramientas.

Nota:: quizás 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 la compilación.

1

Dado que esta pregunta se ha hecho una nueva herramienta ha sido creada: include-what-you-use, que se basa en sonido metálico, proporciona asignaciones de falsificar la existencia de ciertos símbolos (unique_ptr en memory, pero en realidad define en bits/unique_ptr.h en algunas cabeceras estándar y permite usted proporciona a sus propias asignaciones.

proporciona buenos diagnósticos y reescritura automática.

1

Now each of the smaller files needs a subset of the #includes that were at the top of the long file.

hago esto utilizando VisualAssistX. en primer lugar compilar el archivo para ver lo que está mal canta. Luego puede usar la función Agregar incluir de VisualAssistX. Así que solo voy y hago clic con el botón derecho en las funciones o clases que sé que necesitan incluir y presiono Agregar Incluir. Vuelva a compilar un par de veces para filtrar las nuevas inclusiones faltantes y ya está hecho. Espero haber escrito comprensiblemente :)

No es perfecto, pero es más rápido que hacerlo a mano.

Cuestiones relacionadas