Uno de mis «no-programador» amigos recientemente decidió hacer un programa de C++ para resolver un complicado problema mecánico.

Escribió cada función por separado, en un .archivo cpp, a continuación, incluidos todos ellos en el principal archivo de origen, algo como esto:

main.cpp:

#include "function1.cpp"
#include "function2.cpp"
...
int main() 
{
...

}

Luego compilado el código, con una sola gcc línea:

g++ main.cpp    //took about 2 seconds 

Ahora, sé que esto debería funcionar, pero no estoy seguro de si la inclusión .cpp archivos directamente en el programa principal que es una buena idea. He visto el siguiente esquema varias veces, donde todos los prototipos de función ir en un archivo de encabezado con la palabra clave extern, como este:

funcs.h:

extern void function1(..);
extern void function2(..);
...

main.cpp:

...
#include "funcs.h"
...

& compilar con:

g++ -c function1.cpp
g++ -c function2.cpp
...
g++ -c main.cpp
g++ -o final main.o function1.o function2.o ...

Creo que este sistema es mejor (con un archivo makefile, por supuesto). Cuáles son las razones que le puedo dar a mi amigo para convencerlo de eso?

  • Todo termina siendo lo mismo, menos posiblemente algunos de vinculador de las optimizaciones que no puede ser aplicado a través de los módulos.
  • gcc y msvc tienen tiempo de vínculo opciones de optimización que permiten que el enlazador para optimizar a través de varios archivo de origen «módulos».
InformationsquelleAutor | 2010-09-29

2 Comentarios

  1. 21

    La principal razón la gente compilar objeto es para ahorrar tiempo. De alto nivel localizada cambios en el código a menudo sólo requiere la compilación de un objeto y volver a vincular, que puede ser más rápido. (Compilación de muchos de los objetos que se dibujan en los montones de encabezados, o de forma redundante a crear instancias de la misma plantillas, en realidad puede ser más lento cuando un cambio en el código común de los desencadenantes más recompilación).

    Si el proyecto es tan pequeña que puede ser compilado en 2 segundos, entonces no hay mucho beneficio real para el enfoque tradicional, a pesar de hacer lo que se espera puede ahorrar tiempo de desarrollo – como la suya y la nuestra aquí :-). De equilibrio, que mantiene un archivo makefile toma tiempo también, aunque no se puede acabar haciendo que de todos modos en fin muy bien la captura de incluir directorios, bibliotecas, compilador de los interruptores etc.

    Repercusiones reales a escrito/código generado:

    • cpp normalmente los archivos de primer incluyen sus propias cabeceras, que proporciona una comprobación de validez que el contenido de la cabecera puede ser utilizado de forma independiente por otros código de cliente: poner todo junto y el espacio de nombres ya está «contaminada» con incluye a partir de principios de los encabezados/archivos de implementación
    • el compilador puede optimizar mejor cuando todo está en una unidad de traducción (+1 para leppie del comentario, hacer hacer lo mismo…)
    • estático no-miembros de las variables y anónimos de los espacios de nombres privados a la unidad de traducción, por lo que la inclusión de múltiples cpps significa compartir estas alrededor, para mejor o peor (+1 para Alexander :-))
    • decir archivos cpp, se define una función o variable que no es mencionado en su encabezado e incluso podría ser en un espacio de nombres anónimos o estática: código más adelante en la unidad de traducción se podría llamar libremente sin necesidad de hackear su propia declaración forward (esto es malo – si la función fue diseñada para ser llamada fuera de su propio cpp, entonces debe haber sido en el encabezado y un expuestas externamente, símbolo de su unidad de traducción del objeto)

    Por CIERTO – en C++ los encabezados pueden declarar funciones sin usar explícitamente el extern palabra clave, y es normal hacerlo.

  2. 6

    La razón para el segundo estilo es porque cada uno de ellos .archivo cpp puede ser tratada por separado, con sus propias clases, variables globales, ect.. sin riesgo de conflicto.

    También es más fácil en los IDEs que vincular automáticamente todos los .archivos cpp (como el MSVC).

Dejar respuesta

Please enter your comment!
Please enter your name here