2010-10-15 6 views
7

He tenido problemas en el pasado cuando intenté portar algún código de C++ escrito en Mac OS X a un sistema Linux, o tratando de compilar código escrito en una versión anterior de gcc/g ++ con uno nuevo:¿Cómo puedo controlar la forma en que gcc/g ++ incluye automáticamente los encabezados?

Parece que algunas versiones (más antiguas?) De gcc/g ++ incluirían automáticamente algunos archivos de encabezado para usted.

Por ejemplo, el código que usa printf debe requerir #include <stdio.h>. Y el código que usa memcpy debe requerir #include <string.h>. Pero dependiendo de la versión de gcc que estoy usando, ocasionalmente incluirá estos para mí.

Causa estragos cuando olvido incluir algo y luego nunca obtienes los errores hasta que voy a compilar el código en otro sistema. En ese punto, es un juego de correr por todo el proyecto y arreglar los includes.

¿Alguien más se ha topado con esto? ¿Hay alguna manera de forzar que gcc se incluya automáticamente o no se incluya automáticamente? O bien, ¿hay alguna manera de saber qué es autoincluding?

+0

Puede ser, si gcc lo hace automáticamente se convertiría en demasiado sutiles para que pueda entender los métodos mismos nombres en diferentes bibliotecas. Pero si hay alguna solución automática me gustaría saber. –

+3

¿Estás seguro de que no son otros encabezados los que tiran de ellos, y en otras plataformas no lo están haciendo? –

+1

gcc no incluye "autoinclude" - probablemente solo esté obteniendo indirectos incluye a través de encabezados que ha incluido explícitamente #, como sugiere Preet anteriormente. En resumen: necesitas arreglar tu código. –

Respuesta

2

¿Estás seguro de que no se trata de otros encabezados tirando de ellos, y en las otras plataformas no lo hace?

0

Al compilar en sistemas diferentes, es posible que encuentre diferentes problemas y no solo los incluya. Sugiero invertir en un sistema de compilación continua que compilará en todos los SO que necesite después de cada actualización del código, para que sepa rápidamente cualquier problema de portabilidad.

También puede colocar todos los archivos de encabezado de sistema comunes dentro de un archivo de encabezado específico que va a escribir e incluirlo sistemáticamente en todos sus archivos.

+0

Esta es una buena sugerencia , pero en un caso, era una biblioteca de terceros (una versión anterior de OpenSceneGraph) y un código viejo que se rompió al actualizar a una versión más nueva de gcc. La compilación automática para múltiples sistemas operativos no habría ayudado aquí, y sospecho que tal vez el problema fue que #includes dentro del sistema, incluidos los archivos se reorganizaron entre versiones de gcc: / – Dave

5

-incluye el archivo Proceso de archivo como si #include "archivo" apareciera como la primera línea del archivo de origen primario. Sin embargo, el primer directorio de búsqueda de archivos es el directorio de trabajo del preprocesador en lugar del directorio que contiene el archivo fuente principal. Si no se encuentra allí, se busca en el resto de la cadena de búsqueda # ... "normal". Si se proporcionan varias opciones de inclusión, los archivos se incluyen en el orden en que aparecen en la línea de comandos.

http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

Cuestiones relacionadas