14 Stimmen

Warum meldet Eclipse CDT: "Syntaxfehler", aber Kompilierung kein Problem

Ich arbeite in bestehendem C-Code, der ein paar Zeilen mit ähnlichen Anweisungen enthält wie diese:

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

Die Struktur collect_conn geht folgendermaßen vor:

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 verwende Eclipse CDT, und es markiert die Zeile mit einer orangefarbenen, verschnörkelten Linie als "Syntaxfehler". Ich denke, sie wird vom CDT-Indexer als solcher gekennzeichnet. Die Kompilierung (manuell in einem Terminal) ist jedoch kein Problem.

Dies ist jedoch etwas umständlich, da die Elemente in der Zeile nicht indiziert werden (daher ist der Baum der Aufrufhierarchie nicht immer korrekt, oder die Hervorhebung von Elementen, usw.).

Warum gefällt Ecipse die Linie nicht, wie sie ist?

28voto

Mike Kucera Punkte 2003

Eclipse CDT enthält einen eigenen Präprozessor/Parser, um Ihren Code zu analysieren und einen Index zu erstellen. Wenn Sie jedoch einen Build aufrufen, ruft CDT Ihren Systemcompiler auf, z. B. gcc. Es kann geringfügige Unterschiede zwischen der vom CDT-Parser akzeptierten Syntax und der von Ihrem Compiler akzeptierten Syntax geben. In diesem Fall kann der CDT-Parser verwirrt werden.

Auf meinem System wird die offsetof Makro wird zu einem Ausdruck erweitert, der die __offsetof__ Stichwort. Dieses Schlüsselwort wird von CDT nicht erkannt, weshalb es zu einem Syntaxfehler kommt. Um dieses Problem zu lösen, hat der CDT-Parser ein Makro eingebaut, das mit __offsetof__ die wie folgt aussieht:

#define __offsetof__(x) (x)

Dies scheint nicht korrekt zu sein, zumindest auf meinem System ist das Ergebnis die Entfernung der __offsetof__ Schlüsselwort aus dem Quelltext, was immer noch zu einem Syntaxfehler führt.

Ich konnte den Syntaxfehler beheben, indem ich auf der Eigenschaftsseite Pfade und Symbole ein Makro für __offsetof__ die auf 'foo' abbildet. Dies gaukelt dem Parser vor, dass es sich nur um einen Aufruf einer Funktion handelt, die er noch nicht gesehen hat, aber nicht um einen Syntaxfehler.

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

11voto

ra. Punkte 1778

Ich habe das Problem in eclipse CDT behoben mit Preferences->C/C++->Language Mappings : Add Inhaltstyp : C-Kopfzeile Sprache : C++

10voto

Hossein Punkte 91

Manchmal, obwohl der Code ohne Fehler kompiliert wird, zeigt der Echtzeit-Codeanalysator von eclipse CDT einige Fehler in C/C++-Dateien an (z. B. 'Funktion xxx konnte nicht aufgelöst werden). Dies liegt daran, dass eclipse CDT seinen eigenen Präprozessor/Parser für die Analyse des Codes und die Erstellung der Indizes verwendet und nicht den des MinGW (oder eines anderen GNU-Compilers). Um dies global für alle eclipse-Projekte im Arbeitsbereich zu beheben, folgen Sie diesen Schritten: (Um dies nur für ein bestimmtes Projekt zu beheben, führen Sie die Schritte 1, 2 und 4 im Menü ' Projekt->Einstellungen ')

1-Menü ' Fenster->Einstellungen->C/C++->Sprachzuordnungen ', fügen Sie die richtigen Zuordnungen wie unten gezeigt hinzu: (z. B. für Inhaltstypen: C++ Source/Header File, GNU C++ Sprache verwenden usw.) Global Language Mappings Settings

2-In Menü ' Fenster->Einstellungen->C/C++->Indexer ', stellen Sie die vollständige Indizierung ein, indem Sie alle Kontrollkästchen ankreuzen (aber nicht das Kästchen "Überspringen"), wie unten gezeigt: Global Indexer Settings

3 In den spezifischen Eigenschaften eines jeden Projekts, Menü ' Projekt->Eigenschaften->C/C++ allgemein->Indexer Deaktivieren Sie das Kontrollkästchen "Projektspezifische Einstellungen aktivieren", wie unten gezeigt: Project Indexer Settings

4-Wiederherstellung der Indizierung, Menü ' Projekt->C/C++ Index->Neu erstellen '.

5voto

jassuncao Punkte 4635

Es scheint, dass der CDT-Parser den Teil offsetof(struct ...) nicht mag. Wenn Sie collect_conn mit einem typedef deklarieren, verschwindet der Fehler. Zumindest bei mir funktioniert der folgende Code:

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 die ursprüngliche Erklärung nicht ändern können, gehen Sie folgendermaßen vor:

typedef struct collect_conn collect_conn_t;

2voto

unwind Punkte 377331

Es könnte verwirrt sein, prüfen Sie, ob Sie eine Definition von [offsetof](http://linux.die.net/man/3/offsetof) in-scope, zum Beispiel. Andernfalls können Sie versuchen, den Ausdruck zu vereinfachen, indem Sie ihn z. B. durch eine #define mit dem offset oder so etwas.

Ich denke, der Compiler könnte eine eingebaute Version von offsetof , während der Compiler/Code-Parser von Eclipses dies nicht kann. Wenn dies der Fall ist, müssen Sie sicherstellen, dass Sie die Definition haben, damit Eclipse Ihren Code richtig analysieren kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X