Perché Eclipse CDT dice: "errore di sintassi", ma la compilazione non è un problema

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sto lavorando nel codice C esistente che ha un paio di righe con istruzioni simili a questa:

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

La struttura collect_conn segue le seguenti linee:

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;
};

Sto usando Eclipse CDT, e segna la linea con una linea a spirale arancione come "errore di sintassi". Penso che sia contrassegnato come tale dall'indicizzatore CDT. Tuttavia, la compilazione (manualmente in un terminale) non è un problema.

Questo è un po 'scomodo, dal momento che gli elementi sulla linea non vengono indicizzati (quindi l'albero della gerarchia delle chiamate non è sempre corretto, o l'evidenziazione degli elementi, ecc.)

Perché a Ecipse non piace la linea così com'è?

È stato utile?

Soluzione

Eclipse CDT contiene il proprio preprocessore / parser per l'analisi del codice e la creazione di un indice. Tuttavia, quando invochi un CDT di build chiama il tuo compilatore di sistema, come ad esempio gcc. Potrebbero esserci delle piccole differenze tra la sintassi accettata dal parser CDT e la sintassi accettata dal compilatore. Quando ciò accade, il parser CDT può essere confuso.

Sul mio sistema la macro offsetof si espande in un'espressione che utilizza la parola chiave __offsetof__ . Questa parola chiave non è riconosciuta da CDT ed è per questo che c'è un errore di sintassi. Per far fronte a questo problema, il parser CDT ha una macro integrata per gestire __offsetof__ che assomiglia a questo:

#define __offsetof__(x) (x)

Questo non sembra essere corretto, almeno sul mio sistema il risultato è la rimozione della parola chiave __offsetof__ dall'origine che porta ancora a un errore di sintassi.

Sono stato in grado di eliminare l'errore di sintassi accedendo alla pagina delle proprietà Percorsi e simboli e aggiungendo una macro per __offsetof__ che mappa su 'pippo'. Ciò induce il parser a pensare che sia solo una chiamata a una funzione che non ha mai visto prima, ma non un errore di sintassi.

In alternativa puoi disattivare la segnalazione degli errori di sintassi nell'editor andando su Window > Preferenze > Generale > Redattori > Editor di testo > Annotazioni e deselezionando tutte le caselle di controllo per i marcatori di indicizzatore C / C ++.

Altri suggerimenti

Ho risolto il problema in eclipse CDT con le preferenze- > C / C ++ - > Linguaggi linguistici: Aggiungi Tipo di contenuto: intestazione C. Lingua: C ++

Sembra che al parser CDT non piaccia la porzione offsetof (struct ...). Se dichiari collect_conn usando un typedef, l'errore scompare. Almeno per me, il seguente codice funziona:

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));

Se non puoi cambiare la dichiarazione originale, fai qualcosa del genere:

typedef struct collect_conn collect_conn_t;

Potrebbe essere confuso, controlla se hai una definizione di offsetof nell'ambito, ad esempio. Altrimenti potresti provare a semplificare l'espressione, scomponendola usando ad es. un #define con offset di, o qualcosa del genere.

Sto pensando che il compilatore potrebbe fornire una versione integrata di offsetof , mentre il compilatore / parser di codice di Eclipses potrebbe non farlo. In tal caso, devi assicurarti di avere la definizione, affinché Eclipse sia in grado di analizzare correttamente il tuo codice.

prova a cambiare l'indicizzatore in " Indicizzatore c / C ++ completo (analisi completa) " in Preferenze- > c / C ++ - > indicizzatore

A volte, sebbene il codice venga compilato senza errori, l'analizzatore di codice in tempo reale di eclipse CDT mostra alcuni errori nei file C / C ++ (ad es. 'La funzione xxx non può essere risolta). Questo perché eclipse CDT usa il proprio preprocessore / parser per analizzare il codice e costruire gli indici invece di quello del MinGW (o di qualsiasi altro compilatore GNU). Per risolvere il problema a livello globale per tutti i progetti eclipse nell'area di lavoro, attenersi alla seguente procedura: (Per risolvere il problema solo per un progetto specifico, segui i passaggi 1, 2 e 4 nel menu " Progetto- > Preferenze ')

Menu 1-In ' Finestra- > Preferenze- > C / C ++ - > Linguaggi linguistici ', aggiungi i mapping corretti come mostrato di seguito: (es. per tipi di contenuto: C ++ File sorgente / intestazione, usa il linguaggio GNU C ++ e così via) Impostazioni globali dei linguaggi linguistici

Menu 2-In ' Finestra- > Preferenze- > C / C ++ - > Indexer ', imposta l'indicizzazione completa selezionando tutte le caselle di controllo (ma non quelle 'Salta') come mostrato in sotto: Impostazioni globali dell'indicizzatore

3-Nelle proprietà specifiche di ogni progetto, menu ' Progetto- > Proprietà- > C / C ++ generale- > Indicizzatore ', Deseleziona 'Abilita impostazioni specifiche del progetto' come mostrato di seguito: Impostazioni dell'indicizzatore di progetti

4-Ricostruisci l'indicizzazione, menu " Project- > C / C ++ Index- > Rebuild '.

Iv ha avuto lo stesso problema. Esistono 2 definizioni di offsetof (una per C e una per C ++). Il problema deriva dall'IMO

Ad esempio se digito

#ifndef __cplusplus
#endif

Eclipse lo renderà grigio. Significa che __cplusplus è definito, ma il mio progetto è una C

Sfortunatamente non trovo una soluzione.

Ho risolto un problema simile dopo aver controllato la scheda Parser di errori nel progetto Makefile nella Creazione guidata nuovo progetto CDT, rimuovendo Parser di errore Visual C di CDT (sto usando gcc)

Ho finito per risolvere il problema in questo modo. Per prima cosa ho aperto le proprietà del progetto, poi la categoria C / C ++ general- > Paths and Symbols. Nella scheda Simboli ho aggiunto questa voce:

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

Questi simboli sono usati dall'indicizzatore ma non passati al compilatore (almeno nei progetti Makefile, non l'ho provato nell'altro tipo di progetto C), quindi non sovrascrive l'offset incorporato di GCC

Ho visto Eclipse farlo alcune volte e lo uso per Java. Di solito la chiusura e l'apertura del file lo risolvono per me (ripristina tutto ciò che è sbagliato). Di solito sembra che ci sia stato un errore che era lì ma è stato corretto e la "cache degli errori" non viene aggiornato correttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top