2012-07-18 749 views
7

Estoy empezando a trabajar con una biblioteca de terceros y al compilarlo en Visual Studio 2010, noté que recibía esta advertencia de enlazador muchas veces (LNK4221). Miré las fuentes utilizadas en la creación de los archivos objeto que estaban siendo vinculados y encontré que toda la implementación de estos se encuentra en los archivos de encabezado. Curiosamente, también noté que el proyecto incluía archivos .cpp correspondientes que contenían solo un #include para el encabezado con la implementación.¿Cuál es el punto de un archivo .cpp que contiene solo un único #include?

Tengo curiosidad: ¿cuál es el sentido de esto y por qué querría utilizar esta técnica? Si los archivos .cpp no ​​agregan ningún valor al proyecto, ¿por qué no debería simplemente eliminarlos para eliminar las advertencias del enlazador?

Intenté buscar preguntas similares, pero no encontré nada de interés. Si conoce alguno, por favor vinculelos.

+0

Eso es una advertencia, no un error. –

+0

Sí, lo sé. Me preocupa menos la advertencia que la técnica de usar archivos .cpp que contienen solo un único #include. –

+2

Dos posibles motivaciones: 1 - Puede considerarse buena práctica tener siempre pares '.h' /' .cpp'. Tal vez el autor pensó que agregarían '.cpp' más tarde. 2 - Un archivo '.h' no se puede compilar en un archivo objeto, un archivo' .cpp' puede. – BoBTFish

Respuesta

1

Estoy usando esto para asegurarme de que el encabezado esté al menos en un archivo incluido en la primera posición. Al hacerlo, me aseguro de que el encabezado sea compilable por sí mismo.

Para convence que el enlazador no emitir una advertencia, se podría utilizar una variable externa con una variable muy grande:

int variable_with_a_name_that_includes_the_file_name_somehow = 42; 
+0

Sí, eso tiene sentido, pero ¿eliminarías ese archivo si luego usaras el encabezado en otro lugar? –

+0

@Joe no, cuando está incluido en otro lado, es difícil asegurarse de que sucederá en el futuro y de que nadie incluirá una inclusión antes de incluir. –

+0

OK, entonces en ese caso solo actúa como salvaguarda contra el mal uso en el futuro. ¡Gracias! –

2

fue el single #include d archivo stdafx.hy? I. Ese caso, se trata de precompiled headers. La configuración normal es para un archivo .cpp que tenga la opción del compilador "generar encabezados precompilados" y el resto de los archivos .cpp en su proyecto que tengan "use pch".

+0

No, en realidad no era stdafx.h, pero encontré referencias cuando busqué las respuestas antes. Sin embargo, esto sigue siendo información útil, ¡así que gracias! –

Cuestiones relacionadas