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 ++.
Кажется, что синтаксическому анализатору 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;
Может быть, путаница, проверьте, например, есть ли у вас определение смещения
в области видимости. В противном случае вы можете попробовать упростить выражение, разбив его, например, используя #define
со смещением
или что-то в этом роде.
Я думаю, что компилятор может предоставить встроенный в версии offsetof
, в то время как компилятор / анализатор кода Eclipses может этого не делать. Если это так, вам нужно убедиться, что у вас есть определение, чтобы Eclipse мог правильно проанализировать ваш код.
Я видел, как Eclipse делал это несколько раз, и я использую его для Java. Обычно закрытие и открытие файла снова исправляет это для меня (сбрасывает все, что не так). Обычно кажется ошибкой, что WAS там, но был исправлен и «кэш ошибок» не обновляется правильно.
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.
try switching the indexer to "Full c/C++ indexer (complete parse)" in Preferences->c/C++ -> indexer