Единица <SomeUnit>рекурсивно использует себя (но это не так) - PullRequest
2 голосов
/ 07 апреля 2011

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

Я могу изменить бизнес-логику и другой код в разделе реализации модуля данных и скомпилировать без каких-либо проблем.Однако любое изменение в разделе интерфейса модуля данных и последующей компиляции приводит к ошибке компилятора «Модуль MyDataModule рекурсивно использует сам себя».Сборка вместо компиляции устраняет ошибку.

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

Есть ли у кого-нибудь идеи о том, как отслеживатьэто вниз или это исправить?Действительно раздражает необходимость компилировать, закрывать диалоговое окно с ошибкой, а затем создавать каждый раз, когда в модуль данных вводится новый запрос или метод.

EDIT : обращение к некоторым комментариям ниже ив ответе @ Marjan:

Я не использую варианты или отладку dcus.Я попытался найти решение в одном из результатов поиска Google, которое выглядело обещая о поврежденных файлах .identcache или .local, но не сработало.

Предложение Tried @ Jørn;очистил все temp и скомпилировал .dcus, сделал компиляцию, и все хорошо.Сделал изменение в интерфейсе (объявил булеву переменную в закрытом разделе объявления класса модуля данных) и нажал Ctrl + F9 для компиляции.Ошибка.Сделал Build, все хорошо.Компиляция тогда работает нормально.Удалите логическое значение, попробуйте скомпилировать: ошибка.

У меня есть примерно 20 проектов одинакового размера (~ 750K-1M LOC), ни один из которых не демонстрирует такого поведения.Я четыре раза проверил, что модуль данных не находится в разделе интерфейса ни одного из модулей в проекте.Сам модуль данных не очень большой (всего 8 345 строк от «единицы» до «конца», включая комментарии и пустые строки).Файл .dfm, представленный в виде текста, содержит в общей сложности 8 916 строк.

РЕДАКТИРОВАТЬ 2 : Я полагаю, мне придется принять (пока что, во всяком случае), что это сбой компилятора,Я собираюсь попробовать кое-что перестроить, чтобы разбить некоторые функциональные возможности на отдельный модуль данных, чтобы увидеть, является ли это ограничением по размеру (возможно, элементами в DFM) или чем-то еще.Спасибо за все усилия.

Ответы [ 6 ]

11 голосов
/ 07 апреля 2011

Вы столкнулись с ошибкой компилятора.См. Вопрос LKesslers: Почему добавление Action приводит к фатальной ошибке в Delphi для других ситуаций, в которых это происходит.

И еще: http://objectmix.com/delphi/633618-option-use-debug-dcus-causes-compiler-error.html, чтосвязанные с использованием debug dcu's.

И если вы гуглите по нему (http://www.google.com/search?q=delphi+%22recursively+uses+itself%22+compiler+error), похоже, это было примерно с D4 ...

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

update

Я выкопал две другие ссылки с возможной информацией по этому вопросу.Однако они оба на экспертном обмене.Я обычно не включаю ссылки на обмен экспертами, потому что я не согласен с их modus operandi (требуя денег для доступа к экспертам).В этом конкретном случае я подумал «обмануть» (подписаться, получить ответ, опубликовать его здесь и отменить мою подписку), чтобы помочь Кену, Дэвиду и всем остальным, кто столкнулся с этой проблемой.Тем не менее, это не совсем правильно, плюс я не собираюсь расставаться с данными моей кредитной карты при подписке, даже если я могу отменить ее до того, как они начнут списывать со счетов.

Поскольку другие могут придерживаться разных взглядов на обмен экспертамии / или может быть достаточно увлеченным, чтобы делать то, что я не готов сделать, ссылки: http://www.experts -exchange.com / Программирование / Языки / Pascal / Delphi / Q_10206864.html и http://www.experts -exchange.com / Программирование / Языки / Pascal / Delphi / Q_23848477.html Оба вопроса помечены как "решенные" и "подтвержденные под вопросом".Что бы это ни значило.

2 голосов
/ 25 октября 2012

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

0 голосов
/ 25 октября 2012

У нас были те же проблемы.Это происходит случайно после изменения некоторых несвязанных файлов.

В нашем случае проблема была:

  1. В некоторых файлах (x.pas) есть "commonUnit.pas" в части использования - но это не так
  2. изменить "commonUnit.pas" или лучше "SomeConsts.pas" (который используется commonUnit.pas, но не x.pas)
  3. компиляция (иногда) не удалась ссообщение "Unit commonUnit.pas рекурсивно использует себя"
  4. перестроить проблему с исправлениями проекта

Среда нашего проекта:

  • одна папка "Compiled" (входит в комплект)в пути поиска в первую очередь)
  • все DCU скомпилированы в эту папку
0 голосов
/ 08 апреля 2011

Вы пытались запустить Delphi с параметром командной строки "-nocache"?Это решило много проблем для меня.Я нашел это решение где-то на форумах Embarcadero.

0 голосов
/ 08 апреля 2011

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

Перекрывающиеся или сложные пути поиска или библиотеки, и ОСОБЕННО совместно используемые DCU имеют тенденцию вызывать такие проблемы.

0 голосов
/ 08 апреля 2011

думал об этом.
Delphi может поместить DCU в другую папку, чем файл pas.
Если порядок поиска во время компиляции ненадежен, он сначала найдет DCU и использует из этого раздел интерфейса, а затем найдет файл PAS и использует реализацию там.

Если вы заставите DCU находиться в том же каталоге, что и файл PAS, проблема исчезнет?

...