Почему Кодан не может найти 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
от родителя, но проблема все еще существует.
Примечание по тестированию
При тестировании, что работает, а что нет, я заметил пару вещей
- Анализ кода не запускается повторно при изменении настроек предпочтений Code Analysis, мне все еще нужно внести изменения в редактор (просто добавление пробела работает)
- Отключение настройки анализа кода для
Symbol is not resolved
ошибка не исчезнет. - Выключить все
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
,