2011-05-13 11 views
12

Tengo un proyecto de C++ con varios archivos de origen y varios archivos de encabezado. A veces, quiero enviar a alguien mi proyecto (generalmente para un concurso de programación) y sería bueno si hubiera una forma automática de colapsar todos los archivos en un único archivo .cpp.Combinar archivos C++ en un único archivo de origen

Así que, por ejemplo, si tuviera a.cpp, a.h, b.cpp, b.h etc., quiero obtener una main.cpp que compile y ejecute correctamente. Si no hay ninguna herramienta disponible, imagino que todo lo que tiene que hacer es fusionar los archivos de encabezado y anexar los archivos fuente entre sí. ¿Sin embargo hay problemas con externos, incluyen dependencias y declaraciones directas?

+0

Demasiadas respuestas para "evitar" la pregunta. No puedo comprimir mi proyecto porque el juez en línea espera que se compile y ejecute un único archivo cpp. – aramadia

+0

La solución está en cambiar el juez. El juez debería preocuparse por encontrar un archivo MAKE y qué esperar como salida del archivo MAKE (por ejemplo, el nombre del ejecutable). Pero, por supuesto, eso no es una comodidad para ti. – wilhelmtell

+1

Mi propuesta: utilice una opción de compilación como/E para VC 2015 para ejecutar solo el preprocesador. Cómo funciona: Genere un archivo .cpp, que incluya todos los archivos .cpp '#include" a.cpp " #include" b.cpp " ...' de su proyecto (¡no archivos .h!). A continuación, compile este único archivo .cpp con la opción/E. El resultado (stdout) es un archivo .cpp único, que contiene todo el proyecto. Eso no es conveniente y la salida no es realmente una belleza. Sin embargo, funciona. – mdew

Respuesta

2

No conozco una herramienta que combine archivos .cpp, pero simplemente comprimiría todos los archivos juntos y los enviaría como un archivo gzip.

1

En general, no puede hacer esto. Si bien puede pegar felizmente el contenido de los archivos de encabezado en las ubicaciones de los #include s correspondientes, no puede, en general, simplemente concatenar los archivos de origen. Para empezar, puede terminar nombrando enfrentamientos entre cosas con alcance de archivo. Y dado que tendrá archivos de encabezado copiados (con definiciones de clase, etc.) en cada archivo fuente, terminará con clases definidas varias veces.

Hay soluciones mucho mejores. Como se ha mencionado, ¿por qué no simplemente comprimir todo el directorio de su proyecto (después de haber eliminado los archivos de objetos generados automáticamente, etc.)? Y si realmente debe tener un solo archivo fuente, ¡simplemente escriba un único archivo fuente!

0

Creo que el proyecto con encabezados, archivos de fuentes debe ser más bonito que el que tiene un solo archivo principal. No solo es más fácil trabajar y leer, sino que también saben que se hace un buen trabajo al separar los módulos del programa.

Debido a su solución, proporciono este formato y creo que tiene que hacer el trabajo manual:

// STL headers 


// --- prototype 
// monster.h 

// prince.h 

// --- implementation 

int main() { 
// your main function 
return 0; 
} 
+0

Acepto, el archivo cpp es solo para envío. La razón por la que tengo varios archivos es porque es más fácil de comprender y editar, pero el resultado final * HAS * es un único archivo cpp. – aramadia

-2

Se podría utilizar quizá github. Es un sistema de versión y comparte su código de esta manera. De esta manera, su código aún estaría organizado (encabezados y fuente), lo que hace que sea más fácil de leer para todos (incluso para la persona con quien lo comparte).

Editar: Es lamentable que no pueda realizar tareas sencillas, como descargar archivos. No conozco las herramientas que pueden combinar archivos como desee, pero es posible que desee echar un vistazo al CodeSmith Studio. Es un poco una curva de aprendizaje, pero puede ser bastante efectiva si se usa correctamente.

+0

El concurso está dirigido por un programa llamado juez en línea. Espera un solo cpp y no puede realizar tareas avanzadas como las transferencias de git. – aramadia

+0

Hum. Tal vez podrías usar CodeSmith. – ALOToverflow

-2

Si elige enviar un archivo individual en lugar de un archivo comprimido, como un tarball o un archivo comprimido, probablemente haya algunas cosas que debe considerar.

Primero, concatene los archivos como Thomas Matthews ya mencionó. Con algunos cambios, normalmente puede compilar un archivo. Elimine las declaraciones #include inexistentes, como las cabeceras que ahora se han incluido.

También deberá concatenar estos archivos en sus respectivas órdenes de dependencia. Es decir, si a.cpp necesita una clase declarada en b.hpp, lo más probable es que necesite concatenar en el orden en que figura Thomas Matthews.

Dicho esto, creo que la mejor manera de compartir el código es a través de un repositorio público, como GitHub.com o compressedarchive.

0

bueno, esto es possiable, he visto muchos proyectos combinan archivos de origen a un solo .hy .c/.cpp, como SQLite

pero el código debe tener ciertos límites, como por ejemplo que no debería tener variable global estática en uno de sus códigos fuente.

Puede que no tenga una herramienta genérica para combinar fuentes. Debe escribir una base en su código.

aquí es algunos ejemplos

gaclib source pack tool

0

También necesitaba esto para un concurso de codificación. Codingame para ser preciso. Así que escribí un script de JavaScript rápido para hacer el truco. Puede encontrarlo aquí: https://www.npmjs.com/package/codingame-cpp-merge

Lo usé en 1 concurso en vivo y un juego fuera de línea y nunca produjo malos resultados. Siéntase libre de sugerir cambios o hacer solicitudes de extracción en github!

Cuestiones relacionadas