Почему Кодан не может найти size_t

Я только начал использовать Eclipse Indigo (из Galileo), и я получаю маленькие красные ошибки в канаве для каждого использования size_t.

Код компилируется без проблем, но я подозреваю, что должен явно добавить путь к каталогам включения. У меня уже есть обычные подозреваемые там. Я выполняю кросс-компиляцию для процессора ColdFire с использованием цепочки инструментов Gnu, так что в дополнение к стандартному include из mfg чипа, который у меня есть, включает в себя под m68k-elf

\include  
\include\c++\4.2.1
\include\c++\4.2.1\include
\include\c++\4.2.1\m68k-elf

Обновить

Я заметил, что единственное место, где существует stddef.h для этого набора инструментов, находится в lib каталог

gcc-m68k\lib\gcc\m68k-elf\4.2.1\include

Я добавил этот путь, родительский путь и \include-fixed от родителя, но проблема все еще существует.

Примечание по тестированию

При тестировании, что работает, а что нет, я заметил пару вещей

  1. Анализ кода не запускается повторно при изменении настроек предпочтений Code Analysis, мне все еще нужно внести изменения в редактор (просто добавление пробела работает)
  2. Отключение настройки анализа кода для Symbol is not resolved ошибка не исчезнет.
  3. Выключить все Syntax and Semantic Errorsзапуск анализа, возвращение и включение их всех, а затем выключение Symbol is not resolved предотвращает появление ошибки

5 ответов

Решение

Проверьте настройки вашего индексатора в Предпочтения -> C/C++ -> Индексатор.

Там есть поле под названием "Подано для индексации заранее". Его содержимое должно быть:

cstdarg, stdarg.h, stddef.h, sys/resource.h, ctime, sys/types.h, signal.h, cstdio

Если там есть что-то еще, попробуйте заменить его на приведенный выше, затем перестройте индекс и посмотрите, решит ли это проблему.

(В частности, если то, что у вас есть в этом поле stdarg.h, stddef.h, sys/types.hтогда у меня есть довольно хорошее предположение относительно того, что пошло не так. В Eclipse Ganymede значение этого поля было stdarg.h, stddef.h, sys/types.h, В более новых версиях (Galileo и Indigo) он был изменен на вышеуказанный. Однако, поскольку это поле является частью "предпочтений", если вы экспортировали свои предпочтения Ganymede и импортировали их в Galileo/Indigo, это поле было перезаписано старым значением Ganymede. Я был сожжен этим некоторое время назад.)

Чтобы убедиться, чтобы получить size_t вам следует #include заголовок <cstddef>; тогда это будет std::size_t, если вы также не положили using namespace std или using std::size_t,

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

Я использую Fedora и, к сожалению, у нее есть файл stddef.h в / usr / include / linux.... который на самом деле пуст. Поэтому, хотя у меня был файл stddef.h компилятора в пути включения, индексатор фактически анализировал этот другой пустой файл. Итак, что нужно было сделать было:

Префикс вашего пути и списка символов с указанным компилятором путём включения (в моем случае это был /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/), чтобы избежать анализа другого пустого stddef.h.

Если ваш набор инструментов может скомпилировать код только с включенными по умолчанию путями и символами, достаточно просто настроить Eclipse для их использования. Идти к C/C++ Build -> Discovery Options в свойствах проекта и для каждого языка измените Compiler invocation command из родного компилятора (например, g++) к вашему кросс-компилятору (например, C:\nburn\gcc-m68k\bin\g++ возможно?). Затем при следующей сборке будет запущено автообнаружение и обновлены так называемые "встроенные" пути и символы, которые отображаются в проекте. C/C++ General -> Paths and Symbols к тому, что сообщал ваш компилятор, и вы можете переиндексировать снова, чтобы убедиться, что все предупреждения для старых "встроенных модулей" пропали.

У меня на самом деле была такая же проблема. Проблема, похоже, была такой же, как описанная в посте fquinner, расположенном в stddef.h /usr/include/linux/stddef.h тоже был пуст. Как ни странно, правильный stddef.h был найден по затмению и даже может быть открыт без каких-либо проблем.

Если вам просто нужно исправить индексирование по Eclipse, как я (например, при сборке с другим инструментом сборки в любом случае), эту проблему с индексированием можно обойти, определив __SIZE_TYPE__ к ожидаемому типу, например long unsigned int под C/C++ General -> Paths and Symbols,

Другие вопросы по тегам