¿Por qué dice Eclipse CDT: "error de sintaxis", pero la compilación no es un problema

StackOverflow https://stackoverflow.com/questions/802410

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy trabajando en el código C existente que tiene un par de líneas con declaraciones similares a esta:

struct collect_conn *tc = (struct collect_conn *) 
     ((char *)c - offsetof(struct collect_conn, runicast_conn));

La estructura collect_conn sigue las siguientes líneas:

struct collect_conn {
  struct runicast_conn runicast_conn;
  struct announcement announcement;
  const struct collect_callbacks *cb;
  struct ctimer t;
  uint16_t rtmetric;
  uint8_t forwarding;
  uint8_t seqno;
};

Estoy usando Eclipse CDT, y marca la línea con una línea naranja ondulada como 'error de sintaxis'. Creo que está marcado como tal por el indexador CDT. Sin embargo, la compilación (manualmente en un terminal) no es un problema.

Sin embargo, esto es un poco inconveniente, ya que los elementos de la línea no se indexan (por lo que el árbol de jerarquía de llamadas no siempre es correcto, o el resaltado de los elementos, etc.)

¿Por qué a Ecipse no le gusta la línea como es?

¿Fue útil?

Solución

Eclipse CDT contiene su propio preprocesador / analizador para analizar su código y crear un índice. Sin embargo, cuando invoca una compilación, CDT llama al compilador de su sistema, como gcc, por ejemplo. Puede haber pequeñas diferencias entre la sintaxis aceptada por el analizador CDT y la sintaxis aceptada por su compilador. Cuando esto sucede, el analizador CDT puede confundirse.

En mi sistema, la macro offsetof se expande en una expresión que usa la palabra clave __offsetof__ . CDT no reconoce esta palabra clave, por eso hay un error de sintaxis. Para resolver este problema, el analizador CDT tiene una macro integrada para tratar con __offsetof__ que tiene este aspecto:

#define __offsetof__(x) (x)

Esto no parece ser correcto, al menos en mi sistema, el resultado es la eliminación de la palabra clave __offsetof__ de la fuente, lo que aún conduce a un error de sintaxis.

Fui capaz de deshacerme del error de sintaxis yendo a la página de propiedades de Trayectorias y símbolos y agregando una macro para __offsetof__ que se asigna a 'foo'. Esto engaña al analizador para que piense que es solo una llamada a una función que no ha visto antes, pero no un error de sintaxis.

Alternativamente, puede desactivar el informe de errores de sintaxis en el editor yendo a Window > Preferencias > General > Editores > Editores de texto > Anotaciones y desactivación de todas las casillas de verificación de los marcadores de indexador de C / C ++.

Otros consejos

He solucionado un problema en eclipse CDT con Preferencias- > C / C ++ - > Asignaciones de idiomas: Agregar Tipo de contenido: encabezado C Lenguaje: C ++

Parece que al analizador de CDT no le gusta la parte offsetof (struct ...). Si declara collect_conn utilizando typedef, el error desaparece. Al menos para mí, el siguiente código funciona:

typedef struct  {
   struct runicast_conn runicast_conn;
   struct announcement announcement;
   const struct collect_callbacks *cb;
   struct ctimer t;
   uint16_t rtmetric;
   uint8_t forwarding;
   uint8_t seqno;
} collect_conn;
...
struct collect_conn *tc = (struct collect_conn *)
     ((char *)c - offsetof(collect_conn, runicast_conn));

Si no puedes cambiar la declaración original, haz algo como esto:

typedef struct collect_conn collect_conn_t;

Puede estar confundido, verifique si tiene una definición de offsetof en el ámbito, por ejemplo. De lo contrario, podría intentar simplificar la expresión, dividiéndola usando, por ejemplo, un #define con el offset de, o algo así.

Estoy pensando que el compilador podría proporcionar una versión integrada de offsetof , mientras que el compilador / analizador de código de Eclipses podría no. Si es así, deberá asegurarse de tener la definición, para que Eclipse pueda analizar su código correctamente.

intente cambiar el indexador a " indexador c / C ++ completo (análisis completo) " en Preferencias- > c / C ++ - > indexador

A veces, aunque el código se compila sin errores, el analizador de código en tiempo real de eclipse CDT muestra algunos errores en los archivos C / C ++ (por ejemplo, 'La función xxx no se pudo resolver). Esto se debe a que eclipse CDT utiliza su propio preprocesador / analizador para analizar el código y construir los índices en lugar del de MinGW (o cualquier otro compilador GNU). Para solucionar esto globalmente para todos los proyectos de eclipse en el área de trabajo, siga estos pasos: (Para solucionar esto solo para un proyecto específico, siga los pasos 1, 2 y 4 en el menú ' Proyecto- > Preferencias ')

Menú 1-In ' Ventana- > Preferencias- > C / C ++ - > Asignaciones de idiomas ', agregue las asignaciones correctas como se muestra a continuación: (por ejemplo, para tipos de contenido: C ++ Archivo de origen / encabezado, use lenguaje GNU C ++, etc.) Configuración global de asignaciones de idiomas

Menú 2-In ' Ventana- > Preferencias- > C / C ++ - > Indexador ', establece la indexación completa marcando todas las casillas de verificación (pero no las 'Omitir') como se muestra en abajo: Configuración global del indexador

3-En las propiedades específicas de cada proyecto, en el menú ' Proyecto- > Propiedades- > C / C ++ general- > Indexador ', desmarque 'Habilitar la configuración específica del proyecto' como se muestra a continuación: Configuración del indexador de proyectos

4-Reconstruir la indexación, menú ' Proyecto- > C / C ++ Index- > Reconstruir '.

Iv tiene el mismo problema. Hay 2 definiciones de offsetof (una para C y otra para C ++). OMI el problema viene de eso

Por ejemplo, si escribo

#ifndef __cplusplus
#endif

Eclipse lo pondrá en gris. Significa que __cplusplus está definido, pero mi proyecto es una C

Desafortunadamente no encuentro una solución.

Solucioné un problema similar después de verificar la pestaña Analizadores de errores en el Proyecto Makefile en el Asistente para nuevo proyecto de CDT, eliminando el analizador de errores de Visual C de CDT (estoy usando gcc)

Terminé resolviendo el problema de esta manera. Primero abrí las propiedades del proyecto, luego la categoría C / C ++ general- > Rutas y símbolos. Bajo la pestaña de Símbolos agregué esta entrada:

Symbol: offsetof(TYPE,MEMBER)
Value: ((ssize_t) &((TYPE *)0)->MEMBER)

El indexador utiliza estos símbolos, pero no los pasa al compilador (al menos en los proyectos Makefile, no lo he intentado en el otro tipo de proyecto C), por lo que no anula el desplazamiento incorporado de <

He visto a Eclipse hacer esto algunas veces, y lo uso para Java. Por lo general, cerrar y abrir el archivo nuevamente me lo soluciona (restablece lo que está mal). Por lo general, parece ser un error que estaba allí, pero se ha corregido y el "caché de error" no se actualiza correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top