Frage

Ich arbeite in vorhandenen C-code, die hat ein paar Zeilen mit Anweisungen wie diese:

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

Die Struktur collect_conn geht entlang der folgenden Zeilen:

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

Ich bin mit Eclipse CDT, und es markiert die Zeile mit einer orange Wellenlinie als "syntax-Fehler".Ich denke, es ist, als solche gekennzeichnet durch das CDT indexer.Allerdings compilation (manuell in einem terminal) ist kein problem.

Dies ist ein bisschen unbequem aber, da die Elemente auf der Linie nicht indiziert (also der Aufruf-Hierarchie-Baum ist nicht immer richtig ist, oder die Hervorhebung der Elemente, etc.)

Warum Ecipse nicht, wie die Zeile wie es ist?

War es hilfreich?

Lösung

Eclipse-CDT enthält einen eigenen Präprozessor / Parser für Ihren Code zu analysieren und den Aufbau eines Index. Wenn Sie jedoch einen Build aufrufen ruft CDT auf Ihr System Compiler aus, wie gcc zum Beispiel. Es kann von Ihrem Compiler akzeptiert der CDT-Parser und der Syntax zwischen der Syntax akzeptiert kleinere Unterschiede geben. Wenn dies der CDT-Parser geschieht kann verwirrt werden.

Auf meinem System erweitert das offsetof Makro in einen Ausdruck, der das __offsetof__ Schlüsselwort verwendet. Dieses Schlüsselwort wird nicht von CDT erkannt, so dass deshalb ein Syntaxfehler gibt. Zur Bewältigung der CDT-Parser ein Makro eingebaut, um mit __offsetof__ mit diesem Problem hat, die wie folgt aussieht:

#define __offsetof__(x) (x)

Dies scheint nicht richtig zu sein, zumindest auf meinem System das Ergebnis die Entfernung des __offsetof__ Schlüsselwort aus der Quelle ist, die zu einem Syntaxfehler noch führt.

Ich konnte der Syntaxfehler loszuwerden, indem auf die Pfade und Symbole Eigenschaftenseite und das Hinzufügen eines Makros für __offsetof__ gehen, die zu ‚foo‘ abbildet. Diese Tricks der Parser in seine gerade einen Anruf an eine Funktion denken, es vorher nicht gesehen hat, aber kein Syntaxfehler.

Alternativ können Sie Syntaxfehlermeldungen im Editor deaktivieren, indem Sie auf Fenster gehen> Einstellungen> Allgemein> Editoren> Texteditoren> Anmerkungen und deaktivieren Sie alle Kontrollkästchen für C / C ++ Indexer Markierungen.

Andere Tipps

Ich habe festes Problem in Eclipse CDT mit Einstellungen-> C / C ++ -> Sprache Mappings: In Inhalt Typ: C-header Sprache: C ++

Es scheint, der CDT-Parser nicht den Teil mag offsetof (struct ...). Wenn Sie collect_conn mit einem typedef deklarieren geht der Fehler weg. Zumindest für mich, der folgende Code funktioniert:

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

Wenn Sie nicht die ursprüngliche Erklärung etwas tun, ändern können wie folgt aus:

typedef struct collect_conn collect_conn_t;

Es könnte verwechselt werden, überprüfen Sie, ob Sie eine Definition von offsetof in-scope haben, zum Beispiel. Ansonsten könnten Sie versuchen, den Ausdruck zu vereinfachen, ist es bis zu brechen zum Beispiel unter Verwendung von ein #define mit dem offset von, oder so etwas.

Ich denke, der Compiler bieten könnte eine integrierte Version von offsetof, während Eclipses Compiler / Code-Parser möglicherweise nicht. Wenn ja, würden Sie brauchen, um sicherzustellen, dass Sie die Definition haben, für Eclipse zu können richtig Code analysieren.

versuchen, den Indexer Umschalten auf "Full c / C ++ Indexer (komplett Parse)" in Einstellungen-> C / C ++ -> Indexer

Manchmal, obwohl der code kompiliert ohne Fehler, eclipse CDT die Echtzeit-code-analyzer zeigt einige Fehler in C/C++ - Dateien (zB.Funktion der xxx konnte nicht aufgelöst werden).Dies ist, weil eclipse CDT verwendet eigene preprocessor/parser zur Analyse von code und den Aufbau der Indizes anstelle der MinGW ist eine (oder jede andere GNU-compiler).Um dieses Problem zu beheben Global für alle eclipse-Projekte in den Arbeitsbereich, gehen Sie folgendermaßen vor:(Um dieses Problem zu beheben, die nur für ein bestimmtes Projekt, führen Sie die Schritte 1, 2 und 4 im Menü 'Projekt->Einstellungen')

1-Im Menü 'Window->Preferences->C/C++->Language-Mappings', fügen Sie die richtigen Zuordnungen wie gezeigt in unten:(zB.für content-Typen:C++ - Quell - /Header-Datei, die GNU-C++ - Sprache und so weiter) Globale Zuordnungen Sprache-Einstellungen

2-In-Menü 'Window->Preferences->C/C++->Indexer', set full Indizierung durch überprüfung Checkboxen (aber nicht "Überspringen" sind), wie gezeigt in unten:Global Indexer-Einstellungen

3-In jedem Projekt die passenden Eigenschaften-Menü 'Project->Properties->C/C++ general->Indexer'Deaktivieren 'Aktivieren, werden projektspezifische Einstellungen" wie gezeigt in unten:Projekt Indexer-Einstellungen

4-die Indizierung neu erstellen, Menü 'Projekt->C/C++ Index->Rebuild'.

Iv bekam das gleiche Problem. Es gibt 2 Definition offsetof (ein für C und ein für C ++). IMO das Problem aus, dass kommen

Zum Beispiel, wenn i-Typ

#ifndef __cplusplus
#endif

Eclipse es grau. Es bedeutet __cplusplus definiert ist, aber mein Projekt ist ein C

Leider nicht, dass ich ein Update finden.

Ich reparierte ähnliches Problem, nachdem Sie den Registerkarte Fehler Parser in Makefile-Projekt in New CDT-Projekt-Assistenten überprüft, Entfernen von CDT Visual C Fehlern Parser (Ich bin mit gcc)

ich am Ende das Problem wie folgt zu lösen. Zuerst öffnete ich die Projekteigenschaften, dann die C / C ++ allgemein-> Pfade und Symbole Kategorie. Unter der Registerkarte Symbole hinzugefügt ich diesen Eintrag:

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

Diese Symbole werden durch den Indexer verwendet, aber nicht an den Compiler übergeben (zumindest in Makefile-Projekten, habe ich nicht in der anderen Art von C-Projekt versucht), so dass es nicht GCC enthebt eingebaute in offsetof

Ich habe dies einige Male gesehen Eclipse-tun, und ich verwende es für Java. Normalerweise Schließen und Öffnen der Datei wieder fixiert es für mich (zurücksetzt, was falsch ist). Es scheint in der Regel um einen Fehler zu sein, dass es aber, wird behoben und die „Fehler-Cache“ wird nicht korrekt aktualisiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top