2016-10-27 2 views
1

Я использую Eclipse CDT для проекта C. Я использую только редактор, поскольку среда сборки находится вне Eclipse.Редактор Eclipse, не отображающий ошибки в функциях и значениях перечисления, не входит в комплект

маркеры ошибок в коде shwon, как ожидается, с некоторыми исключениями:

  1. Когда я делаю вызов функции это не имеет значения, если функция существует или нет. Редактор никогда не будет показывать маркер ошибки в вызове функции. Я ожидал бы ошибку «Unresolved symbol» или аналогичную. Я ожидал бы, что имена функций с ошибками будут отображаться как ошибка, и я ожидаю, что существующие функции будут объявлены в заголовочных файлах, которые я забыл включить, чтобы отображаться как ошибки. Но это не так.

  2. Когда я ввожу имя члена перечисления, который существует где-то еще (в файле заголовка) в проекте, тогда редактор распознает его, даже если я не включаю заголовочный файл, где он включен. Это, конечно, приведет к ошибке компилятора, но я ожидаю маркер ошибки в редакторе.

Есть ли какие-то настройки, которые мне не хватает? Или это так, как работает редактор eclipse?

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

ответ

0

Разрешающая имена, определения которых в проекте, но не достижимы через включает в себя, это известная проблема , Он отслеживается bug 297690, и он близок к исправлению (большая часть тяжелой работы выполняется в bug 402498).

Устранение имени функции, которая вообще отсутствует в проекте, может произойти в двух ситуациях.

В коде C

Язык C не требует, чтобы функции были объявлены до их использования. Использование без предшествующего объявления рассматривается как неявное объявление.

То есть, следующий файл C действителен код:

void func() { 
    another_func(); // another_func is implicitly declared here 
} 

Компоновщик будет пытаться найти определение функции соответствия во время связи, и выдаст ошибку, если она не может.

Таким образом, если вы пропустили another_func, ошибка не будет обнаружена во время компиляции (только при ссылке), и аналогично CDT не сможет ее диагностировать.

В C шаблон кода

В отличие от C++, C++ делает требуют, чтобы функции были объявлены до их использования. Однако есть одна тонкость, включающая шаблоны.

Если вызов функции происходит внутри шаблона и некоторые аргументы зависят:

template <typename T> 
void foo(T t) { 
    misspelt_function(t); 
} 

CDT не может диагностировать орфографическую функцию в точке 'определений s из-за путем C++ foo дву- s правила поиска имен по фазе: было бы целесообразно дать определение misspelt_functionпосле определение точки foo (но до момента инстанцирования), которое определяется зависимым от аргумента поиска (путем нахождения в пространстве имен, ассоциированном с тип t для данного конкретного экземпляра).

(CDT может в теории диагностики орфографических функций для частности конкретизации из foo, то, как компилятор делает, но в настоящее время не проверять типа тела конкретизации вообще.)

+0

' int dummyfunc (void) { возвращение 55; } int anotherfunc (void) { return dummy_func(); // dummy_func написано с ошибками, но не маркер ошибок не показывает } ' – Habba

+0

Если у меня есть файл C только с этим содержимым: ' INT dummyfunc (аннулируются) { возвращение 55; } int anotherfunc (void) { return dummy_func(); } ' Тогда я ожидаю маркер ошибки при вызове dummy_func, поскольку он ошибочно написан. Но я не вижу маркера ошибки. – Habba

+0

@ Хабба: Ах, хорошо. Я вижу, что происходит. См. Мой отредактированный ответ. – HighCommander4