Почему делает CDT Eclipse, скажите: 'синтаксическая ошибка', но компиляция без проблем

Это ваш эмулятор, выделенный красным

enter image description here

14
задан Rabarberski 29 April 2009 в 13:38
поделиться

6 ответов

Eclipse CDT содержит собственный препроцессор / анализатор для анализа вашего кода и построения индекса. Однако, когда вы вызываете сборку CDT, она вызывает ваш системный компилятор, как, например, gcc. Могут быть небольшие различия между синтаксисом, принятым синтаксическим анализатором CDT, и синтаксисом, принятым вашим компилятором. Когда это происходит, анализатор CDT может запутаться.

В моей системе макрос offsetof расширяется до выражения, использующего ключевое слово __ offsetof __ . Это ключевое слово не распознается CDT, поэтому есть синтаксическая ошибка. Для решения этой проблемы в синтаксическом анализаторе CDT имеется встроенный макрос для работы с __ offsetof __ , который выглядит следующим образом:

#define __offsetof__(x) (x)

Это не похоже на корректность, по крайней мере, в моей системе это приводит к удалению ключевого слова __ offsetof __ из источника, которое все еще приводит к синтаксической ошибке.

Мне удалось избавиться от синтаксической ошибки, перейдя в Paths и Страница свойств символов и добавление макроса для __ offsetof __ , который отображается на 'foo'. Это заставляет синтаксический анализатор думать, что это просто вызов функции, которую он не видел раньше, но не синтаксическая ошибка.

В качестве альтернативы вы можете отключить отчеты о синтаксических ошибках в редакторе, выбрав «Окно»> «Установки»> «Основные»> «Редакторы». > Текстовые редакторы> Аннотации и снятие всех флажков для маркеров индексатора C / C ++.

Мне удалось избавиться от синтаксической ошибки, перейдя на страницу свойств Paths and Symbols и добавив макрос для __ offsetof __ , который отображается в 'foo'. Это заставляет синтаксический анализатор думать, что это просто вызов функции, которую он не видел раньше, но не синтаксическая ошибка.

В качестве альтернативы вы можете отключить отчеты о синтаксических ошибках в редакторе, выбрав «Окно»> «Установки»> «Основные»> «Редакторы». > Текстовые редакторы> Аннотации и снятие всех флажков для маркеров индексатора C / C ++.

Мне удалось избавиться от синтаксической ошибки, перейдя на страницу свойств Paths and Symbols и добавив макрос для __ offsetof __ , который отображается в 'foo'. Это заставляет синтаксический анализатор думать, что это просто вызов функции, которую он не видел раньше, но не синтаксическая ошибка.

В качестве альтернативы вы можете отключить отчеты о синтаксических ошибках в редакторе, выбрав «Окно»> «Установки»> «Основные»> «Редакторы». > Текстовые редакторы> Аннотации и снятие всех флажков для маркеров индексатора C / C ++.

28
ответ дан 1 December 2019 в 06:13
поделиться

Кажется, что синтаксическому анализатору CDT не нравится часть offsetof (struct ...). Если вы объявите collect_conn с помощью typedef, ошибка исчезнет. По крайней мере для меня работает следующий код:

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

Если вы не можете изменить исходное объявление, сделайте что-то вроде этого:

typedef struct collect_conn collect_conn_t;
5
ответ дан 1 December 2019 в 06:13
поделиться

Может быть, путаница, проверьте, например, есть ли у вас определение смещения в области видимости. В противном случае вы можете попробовать упростить выражение, разбив его, например, используя #define со смещением или что-то в этом роде.

Я думаю, что компилятор может предоставить встроенный в версии offsetof , в то время как компилятор / анализатор кода Eclipses может этого не делать. Если это так, вам нужно убедиться, что у вас есть определение, чтобы Eclipse мог правильно проанализировать ваш код.

2
ответ дан 1 December 2019 в 06:13
поделиться

Я видел, как Eclipse делал это несколько раз, и я использую его для Java. Обычно закрытие и открытие файла снова исправляет это для меня (сбрасывает все, что не так). Обычно кажется ошибкой, что WAS там, но был исправлен и «кэш ошибок» не обновляется правильно.

0
ответ дан 1 December 2019 в 06:13
поделиться

Iv got the same problem. There is 2 definition of offsetof (one for C and one for C++). IMO the problem come from that

For example if i type

#ifndef __cplusplus
#endif

Eclipse will grey it. It mean __cplusplus is defined, but my project is a C

Unfortunatly i dont find a fix.

1
ответ дан 1 December 2019 в 06:13
поделиться

try switching the indexer to "Full c/C++ indexer (complete parse)" in Preferences->c/C++ -> indexer

2
ответ дан 1 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: