2009-04-29 19 views
12

estoy trabajando en el código C existente, que tiene un par de líneas con declaraciones similares a éste:¿Por qué dice Eclipse CDT: 'error de sintaxis', pero la compilación ningún problema

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

El collect_conn estructura va de la mano 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 naranja línea serpenteante 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.

Esto es un poco incómodo, sin embargo, ya que los elementos en la línea de no indexación (por lo que el árbol de jerarquía de llamadas no siempre es correcta, o el resaltado de elementos, etc.)

¿Por qué Ecipse no como la línea tal como es?

Respuesta

25

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 del sistema, como gcc, por ejemplo. Puede haber diferencias menores 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 hacer frente a este problema, el analizador CDT ha construido en una macro para hacer frente a __offsetof__ que se parece a esto:

#define __offsetof__(x) (x) 

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

Pude deshacerme del error de sintaxis yendo a la página de propiedades Rutas 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 había visto antes, pero no un error de sintaxis.

O bien, puede desactivar los informes de errores de sintaxis en el editor yendo a Ventana> Preferencias> General> Editores> Editores de texto> Anotaciones y desmarcar todas las casillas de verificación de los Marcadores del indexador C/C++.

+1

gracias Mike. Estaba intentando descubrir cómo desactivar el resaltado de sintaxis ¡Gracias por señalarlo! – iGbanam

2

Podría confundirse, compruebe si tiene una definición de offsetof dentro del ámbito, por ejemplo. De lo contrario, podrías intentar simplificar la expresión, dividiéndola usando, por ejemplo, un #define con el offset de, o algo así.

Creo que el compilador podría proporcionar una versión incorporada de offsetof, mientras que el compilador/analizador de código de Eclipses podría no tenerla. De ser así, debería asegurarse de tener la definición, para que Eclipse pueda analizar correctamente su código.

+0

Al presionar F3 (declaración de declaración) en el desplazamiento, me lleva al archivo stddef.h, por lo que parece hacer referencia al desplazamiento correcto de la macro – Rabarberski

+0

y también #incluye archivo, antes de la línea problemática? – unwind

0

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

+0

Sí, sé a qué te refieres. Debo hacer esto a veces también. Pero en este caso, no se soluciona al hacer esto. – Rabarberski

5

Parece que el analizador CDT no le gusta la parte offsetof (struct ...). Si declara collect_conn utilizando un 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 puede cambiar la declaración original de hacer algo como esto:

typedef struct collect_conn collect_conn_t; 
+0

Sí, de hecho, eso funciona. Pero esta no es una opción para mí :-( – Rabarberski

1

Iv tiene el mismo problema. Hay 2 definiciones de offsetof (uno para C y otro para C++). OMI el problema proviene de que

Por ejemplo, si el tipo i

#ifndef __cplusplus 
#endif 

eclipse gris ella. Significa que __cplusplus está definido, pero mi proyecto es un C

Desafortunadamente no encuentro una solución.

+0

Comprueba que has creado un proyecto de CA y no un proyecto de C++. No tengo el problema que mencionas. – Oliver

2

cambiar el indexador tratar de "c completa indexador/C++ (análisis completo)" en Preferencias-> C/C++ -> indexador

1

me fijo problema similar después de comprobar los analizadores pestaña de error en el Proyecto Makefile en Nueva CDT Asistente de proyectos, la eliminación de CDT Visual C de error del analizador (estoy usando gcc)

+0

¿Alguien sabe cómo hacer esto para un proyecto existente, no un proyecto nuevo? –

6

he fijado problema en Eclipse CDT con Preferencias-> C/C++ -> idioma Asignaciones: Añadir Tipo de contenido: C-encabezado idioma: C++

0

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

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

Estos símbolos son utilizados por el indexador pero no pasan al compilador (al menos en proyectos de Makefile, no he probado en otro tipo de proyecto C) , por lo que no anula la compensación incorporada de GCC de

Cuestiones relacionadas