Почему Eclipse CDT говорит: «синтаксическая ошибка», но компиляция не вызывает проблем - PullRequest
14 голосов
/ 29 апреля 2009

Я работаю в существующем коде C, в котором есть несколько строк с утверждениями, похожими на эту:

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

Структура collect_conn выглядит следующим образом:

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

Я использую Eclipse CDT, и эта строка помечается оранжевой волнистой линией как «ошибка синтаксиса». Я думаю, что это помечено как таковое индексатором CDT. Тем не менее, компиляция (вручную в терминале) не проблема.

Однако это немного неудобно, поскольку элементы в строке не индексируются (поэтому дерево иерархии вызовов не всегда корректно, или выделение элементов и т. Д.)

Почему Ecipse не нравится линия как есть?

Ответы [ 10 ]

27 голосов
/ 07 мая 2009

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

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

#define __offsetof__(x) (x)

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

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

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

8 голосов
/ 05 октября 2012

Я исправил проблему в Eclipse CDT с помощью Preferences-> C / C ++ -> Language Mappings: Добавить Тип контента: C-заголовок Язык: C ++

5 голосов
/ 29 апреля 2009

Кажется, что синтаксическому анализатору 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;
2 голосов
/ 02 мая 2018

Иногда, хотя код компилируется без ошибок, анализатор кода eclipse CDT в реальном времени показывает некоторые ошибки в файлах C / C ++ (например, «Функция xxx не может быть разрешена). Это связано с тем, что eclipse CDT использует собственный препроцессор / анализатор для анализа кода и построения индексов вместо MinGW (или любого другого компилятора GNU). Чтобы исправить это глобально для всех проектов eclipse в рабочей области, выполните следующие действия: (Чтобы исправить это только для конкретного проекта, выполните шаги 1, 2 и 4 в меню ' Project-> Preferences ')

1-In меню ' Window-> Preferences-> C / C ++ -> Language Mappings ', добавьте правильные отображения, как показано ниже: (например, для типов содержимого: C ++ Source / Header File , используйте язык GNU C ++ и так далее) Настройки глобальных сопоставлений языков

2-In меню ' Window-> Preferences-> C / C ++ -> Indexer ', установите полную индексацию, установив все флажки (кроме «Пропустить»), как показано ниже: Глобальные настройки индексатора

3 - В свойствах каждого проекта в меню « Project-> Properties-> C / C ++ general-> Indexer » снимите флажок «Включить настройки для конкретного проекта», как показано ниже: Настройки индексатора проекта

4-Перестроить индексирование, меню ' Проект-> C / C ++ Index-> ​​Перестроить '.

2 голосов
/ 26 октября 2009

попробуйте переключить индексатор на «Полный индексатор c / C ++ (полный анализ)» в Предпочтения-> c / C ++ -> indexer

2 голосов
/ 29 апреля 2009

Это может привести к путанице, проверьте, например, есть ли у вас определение <a href="http://linux.die.net/man/3/offsetof" rel="nofollow noreferrer">offsetof</a> в области видимости. В противном случае вы можете попытаться упростить выражение, разбив его, например, #define с offset или чем-то еще.

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

1 голос
/ 06 декабря 2012

Я решил эту проблему вот так. Сначала я открыл свойства проекта, затем категорию C / C ++ general-> Paths and Symbols. Под вкладкой Символы я добавил эту запись:

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

Эти символы используются индексатором, но не передаются компилятору (по крайней мере, в проектах Makefile, я не пробовал его в других проектах C), поэтому он не отменяет встроенное в GCC offsetof

1 голос
/ 10 августа 2011

Я исправил подобную проблему после проверки вкладки Анализаторы ошибок в проекте Makefile в мастере создания нового CDT, удалив анализатор ошибок CDT Visual C (я использую gcc)

1 голос
/ 30 апреля 2009

У меня такая же проблема. Существует 2 определения offsetof (одно для C и одно для C ++). ИМО проблема в том, что

Например, если я наберу

#ifndef __cplusplus
#endif

Затмение станет серым. Это означает, что __cplusplus определен, но мой проект - C

К сожалению, я не могу найти решение.

0 голосов
/ 29 апреля 2009

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

...