Comportamiento extraño de GCC con la ruta completa incluida frente a la ruta de búsqueda incluida

Me he encontrado con un comportamiento de inclusión de GCC que estoy tratando de entender. El ejemplo que brindo es el código de prueba más simple, el código real (y este comportamiento) son el resultado de una herramienta que estoy usando para instrumentar mi código. I tienen para utilizar esta herramienta. Solo estoy tratando de entender las razones para obtener el error. Curiosamente, g++ funciona bien. Aquí está el ejemplo:

Si incluyo <sys/types.h> todo se compila bien, pero si incluyo "/usr/include/sys/types.h" entonces me sale un error.

Aquí está el error que recibo al ejecutar el primero. gcc comando a continuación que incluye la ruta completa:

In file included from hello.c:7:
/usr/include/sys/types.h:195: error: redefinition of typedef ‘int8_t’
hello.c:5: error: previous declaration of ‘int8_t’ was here

El comando del compilador, usando GCC 4.1.2 (CentOS 5) causa el error:

gcc -g -I. --verbose -c -o hello.o -DLONG_INCLUDE hello.c

o este que no da el error

gcc -g -I. --verbose -c -o hello.o hello.c

Código:

/* hello2.h */

#ifdef _cplusplus
extern "C" {
#endif

int myFunc(int *a);

#ifdef _cplusplus
}
#endif



/* hello.c */
#include <stdio.h>
#include <string.h>
typedef signed char int8_t;
#ifdef LONG_INCLUDE
#include "/usr/include/sys/types.h"
#else
#include <sys/types.h>
#endif
#include "hello.h"


int myFunc(int *a)
{

  if (a == NULL)
    return -1;

  int b = *a;

  b += 20;

  if (b > 80)
    b = 80;

  return b;
}

¡Gracias

ACTUALIZACIÓN:

Después de mirar la salida del preprocesador a través de gcc -E parece que al especificar la ruta completa, gcc no la trata como una ruta de inclusión del sistema y eso, de alguna manera, está contribuyendo (¿causando?) al error. Intenta usar el -isystem opción para /usr/include and /usr/include/sys pero fue en vano.

preguntado el 12 de junio de 12 a las 19:06

Probablemente no relacionado: la macro se llama __cplusplus. Te falta un guión bajo. Además, todo esto compila bien en un gcc no antiguo. -

@pmr Gracias, desafortunadamente, estoy atascado con la versión de GCC y la herramienta dang. En este punto, solo estoy tratando de entender por qué GCC lo trata como un encabezado que no es del sistema. -

Como dijiste,isystem parece ser el camino a seguir aquí. Me preguntaría por qué necesita calificar completamente el camino en primer lugar. Esto parece un poco... roto. -

la herramienta está haciendo todo eso y sí, está realmente rota. lo raro es que isystem no ayuda -

Obtuve el mismo comportamiento con gcc-4.5.1 (¿ya es antiguo, @pmr?). Intenta configurar -D__int8_t_defined, que custodia la int8_t y amigos typedefs en mi <sys/types.h>. -

1 Respuestas

En Glibc <sys/types.h>, las definiciones de tipo para int8_t etc. están custodiados por

#if !__GNUC_PREREQ (2, 7)

/* These types are defined by the ISO C99 header <inttypes.h>. */
# ifndef __int8_t_defined
#  define __int8_t_defined
typedef char int8_t;
typedef short int int16_t;
typedef int int32_t;
#  if __WORDSIZE == 64
typedef long int int64_t;
#  elif __GLIBC_HAVE_LONG_LONG
__extension__ typedef long long int int64_t;
#  endif
# endif

por lo que una solución para el problema sería definir la macro de protección en la línea de comando, pasando -D__int8_t_defined adición a los -DLONG_INCLUDE.

Respondido el 12 de junio de 12 a las 22:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.