Pourquoi Eclipse CDT dit-il: 'erreur de syntaxe', mais la compilation ne pose aucun problème

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

  •  03-07-2019
  •  | 
  •  

Question

Je travaille dans le code C existant qui comporte quelques lignes avec des instructions similaires à celle-ci:

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

La struct collect_conn suit les lignes suivantes:

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

J'utilise Eclipse CDT et marque la ligne avec une ligne ondulée orange en tant qu '' erreur de syntaxe '. Je pense que cela est marqué comme tel par l'indexeur CDT. Cependant, la compilation (manuellement dans un terminal) n’est pas un problème.

Ceci est toutefois un peu gênant, car les éléments de la ligne ne sont pas indexés (ainsi, la hiérarchie des appels n’est pas toujours correcte, ou la mise en surbrillance des éléments, etc.)

Pourquoi Ecipse n'aime-t-il pas la ligne telle qu'elle est?

Était-ce utile?

La solution

Eclipse CDT contient son propre préprocesseur / analyseur pour analyser votre code et créer un index. Cependant, lorsque vous appelez une compilation, CDT appelle le compilateur de votre système, comme gcc par exemple. Il peut y avoir des différences mineures entre la syntaxe acceptée par l’analyseur CDT et celle acceptée par votre compilateur. Lorsque cela se produit, l’analyseur CDT peut devenir confus.

Sur mon système, la macro offsetof se développe en une expression qui utilise le mot clé __ offsetof __ . CDT ne reconnaît pas ce mot clé. C'est pourquoi il y a une erreur de syntaxe. Pour traiter ce problème, l'analyseur CDT a une macro intégrée pour traiter __ offsetof __ qui ressemble à ceci:

#define __offsetof__(x) (x)

Cela ne semble pas être correct. Du moins sur mon système, le résultat est la suppression du mot clé __ offsetof __ de la source, qui entraîne toujours une erreur de syntaxe.

J'ai pu supprimer l'erreur de syntaxe en accédant à la page de propriétés Paths and Symbols et en ajoutant une macro pour __ offsetof __ qui correspond à "foo". Cela incite l’analyseur à penser qu’il s’agit simplement d’un appel à une fonction qu’il n’a jamais vue auparavant, mais pas d’une erreur de syntaxe.

Sinon, vous pouvez désactiver le rapport d’erreurs de syntaxe dans l’éditeur en allant sur Fenêtre > Préférences > Général > Éditeurs > Editeurs de texte > Annotations et désactivation de toutes les cases à cocher pour les marqueurs d'indexation C / C ++.

Autres conseils

J'ai résolu le problème dans eclipse CDT avec Préférences-> C / C ++ - > Langages: ajoutez Type de contenu: En-tête C Langue: C ++

Il semble que l'analyseur CDT n'aime pas la partie offsetof (struct ...). Si vous déclarez collect_conn en utilisant un typedef, l'erreur disparaît. Au moins pour moi, le code suivant fonctionne:

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 vous ne pouvez pas modifier la déclaration d'origine, procédez comme suit:

typedef struct collect_conn collect_conn_t;

Cela pourrait être confus, vérifiez si vous avez une définition de offsetof dans la portée, par exemple. Sinon, vous pourriez essayer de simplifier l’expression en la décomposant, par exemple. un #define avec le offset de, ou quelque chose de ce genre.

Je pense que le compilateur pourrait fournir une version intégrée de offsetof , contrairement au compilateur / analyseur de code d'Eclipses. Si tel est le cas, vous devez vous assurer que vous avez la définition, pour qu'Eclipse puisse analyser correctement votre code.

essayez de faire basculer l'indexeur sur "Indexeur complet c / C ++ (analyse complète)". dans Préférences- > c / C ++ - > indexeur

Parfois, bien que le code soit compilé sans erreur, l'analyseur de code en temps réel d'eclipse CDT affiche des erreurs dans les fichiers C / C ++ (par exemple, la fonction xxx n'a pas pu être résolue). En effet, eclipse CDT utilise son propre préprocesseur / analyseur syntaxique pour analyser le code et construire les index à la place de celui de MinGW (ou de tout autre compilateur GNU). Afin de résoudre ce problème globalement pour tous les projets eclipse de l'espace de travail, procédez comme suit: (Pour résoudre ce problème uniquement pour un projet spécifique, suivez les étapes 1, 2 et 4 du menu ' Projet - > Préférences ')

.

1-Dans le menu ' Fenêtre- > Préférences- & Cf. C ++ - > Langages ', ajoutez les bons mappages comme indiqué ci-dessous: (par exemple, pour les types de contenu: C ++ Fichier source / en-tête, utilisez le langage GNU C ++, etc.) Paramètres des mappages de langues globaux

Menu 2-In ' Fenêtre- > Préférences- > C / C ++ - > Indexeur ', définissez l'indexation complète en cochant toutes les cases à cocher (sauf celles 'Ignorer'), comme indiqué dans au dessous de: Paramètres globaux de l'indexeur

3-Dans les propriétés spécifiques de chaque projet, menu " Projet -> Propriétés -> C / C ++ général -> Indexeur ", décochez "Activer les paramètres spécifiques au projet" comme indiqué ci-dessous: Paramètres de l'indexeur de projet

4-Reconstruisez l'indexation, menu ' Projet- > Index C / C ++- > Reconstruire '.

Iv a le même problème. Il existe 2 définitions de offsetof (une pour C et une pour C ++). OMI le problème vient de cela

Par exemple, si je tape

#ifndef __cplusplus
#endif

Eclipse le grise. Cela signifie que __cplusplus est défini, mais mon projet est un C

Malheureusement, je ne trouve pas de solution.

J'ai corrigé un problème similaire après avoir vérifié l'onglet Analyseurs d'erreur dans le projet Makefile dans l'Assistant Nouveau projet CDT, en supprimant l'analyseur d'erreur CDT Visual C (j'utilise gcc)

J'ai fini par résoudre le problème comme ceci. J'ai d'abord ouvert les propriétés du projet, puis la catégorie C / C ++ général- > Chemins et symboles. Sous l'onglet Symboles, j'ai ajouté cette entrée:

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

Ces symboles sont utilisés par l'indexeur mais ne sont pas transmis au compilateur (du moins dans les projets Makefile, je ne les ai pas essayés dans l'autre type de projet C), ils ne remplacent donc pas le décalage intégré de GCC

J'ai vu Eclipse faire cela plusieurs fois et je l'utilise pour Java. Normalement, fermer et ouvrir à nouveau le fichier le corrige pour moi (réinitialise tout ce qui ne va pas). Il semble généralement y avoir une erreur indiquant que WAS existait mais a été corrigée et que le "cache des erreurs" n'est pas mis à jour correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top