Конвертируя чужой проект из Delphi в Lazarus, натолкнулся на одну вещь, которая мне показалась странной.
Речь пойдет о случае, когда в разных модулях присутствует одно и то же имя. По правилам Паскаля в этом случае используется то, которое стоит после в предложении uses.
Но в Delphi/Lazarus есть два uses. Мною экспериментально установлено, что в этом случае приоритет имеет секция Imlementation, причем и в Delphi и в Lazarus.
А вот это мне кажется неестественным. Ведь объявление в interface обязательно, если используешь что-то в своем интерфейсе. А в implementation можно поместить модуль из-за того, что в реализации потребовалась единственная функция из его состава. Но кроме этой функции в модуле может оказаться куча всего и эта куча получает приоритет и может перекрыть описания объявленные в интерфейсе.
Я не понимаю - зачем так сделано ?
И уж, чтобы оправдать тему форума: проблема перекрытия имен мне кажется решена плохо. Кстати, я даже не знаю утилиты, которая бы искала и предупреждала о подобных проблемах. Я бы предложил дополнительный описатель в объявление модуля (возможно, необязательный):
unit [ private, imported, system] в смысле private - твой личный, Imported - сторонний, System - системный. И при конфликте имен приоритеты в том же порядке.
Если интересует демонстрация, что все обстоит именно так, могу приложить