Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
De Mian Профи
Вступление в Клуб: 26.09.2008
|
Ср Июл 11, 2018 10:27  Фантомные макросы |
|
Полезность: 1
|
Столкнулся тут с такой вещью, назовем её МАКРОС-ФАНТОМ.
Столкнулся то давно, но про природу этого осенило только сегодня.
Итак пример.
Есть библиотека L1 :
Код: | pragma include(::[DOCUMENT].[L2]);
pragma macro(TEST,'pragma error(7777)'); |
Есть библиотека L2 :
Код: | pragma include(::[DOCUMENT].[L1]); |
Т.е в L1 определен макрос TEST, при этом L1 и L2 импортируют макроопределения друг-друга
Далее, Есть операция L3, которая импортирует либо L1 либо L2 либо обе. это не важно - эффект будет одинаков:
Код: | pragma include(::[DOCUMENT].[L2]);
begin
&test;
end; |
ok. Всё компилится успешно.
Но теперь , если убрать из библиотеки L1 макрос TEST, то всё продолжает компилиться, как будто макрос есть.!!!
Природу этого бага примерно понимаю. Это взаимная INCLUDE библиотек L1 и L2, когда одна из них компилится, то забирает в себя все макросы другой. в итоге максроса уже нет, но при компиляции они друг\другу передают его фантомное последнее описание.
Локализация ситуации конечно надуманная, но при проектировани\разработке лично у меня бывали такие ситуации что приводили к этому эффекту: макросов много в разных библиотеках, и чтобы в конечном счете не подключать каждый раз зоопарк библиотек, всё библиотеки сводил через include в одной и подключал только последнюю. Просто тогда не понимал причину, и выяснялось это только при переносе на схему тестирования.
Что думаете по поводу? сталкивались ? как обходили ? |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Ср Июл 11, 2018 13:24  Re: Фантомные макросы |
|
Полезность: Нет оценки
|
De Mian пишет: |
Что думаете по поводу? сталкивались ? как обходили ? |
не сталкивался. А в чом проблема все макросы собрать в отдельной библиотеке и ее инклюдить куда надо, чтобы исключить циклический инклюд ? |
|
 |
De Mian Профи
Вступление в Клуб: 26.09.2008
|
Ср Июл 11, 2018 17:52  Re: Фантомные макросы |
|
Полезность: Нет оценки
|
vtar пишет: |
не сталкивался. А в чом проблема все макросы собрать в отдельной библиотеке и ее инклюдить куда надо, чтобы исключить циклический инклюд ? |
Проблемы нет. многие вообще без макросов обходятся и\или боятся их как огня.
Просто макросы сами по себе добавляют существенной гибкости языку и жаль что такая опасная бага есть. |
|
 |
ezhem Участник со стажем
Вступление в Клуб: 22.05.2008
|
Пн Июл 30, 2018 22:15  Re: Фантомные макросы |
|
Полезность: Нет оценки
|
De Mian пишет: | vtar пишет: |
не сталкивался. А в чом проблема все макросы собрать в отдельной библиотеке и ее инклюдить куда надо, чтобы исключить циклический инклюд ? |
Проблемы нет. многие вообще без макросов обходятся и\или боятся их как огня.
Просто макросы сами по себе добавляют существенной гибкости языку и жаль что такая опасная бага есть. |
Изобилие макросов делает код нечитабельным и несопровождаемым. Гибкость весьма условная. Например, если ошибка всплывает, то по номеру строки на нее не выйти. |
|
 |
De Mian Профи
Вступление в Клуб: 26.09.2008
|
Пн Июл 30, 2018 23:12  Re: Фантомные макросы |
|
Полезность: Нет оценки
|
ezhem пишет: |
Изобилие макросов делает код нечитабельным и несопровождаемым. Гибкость весьма условная. Например, если ошибка всплывает, то по номеру строки на нее не выйти. |
использование макросов по-любому чиху создает плохой код.
Обоснованное же и грамотное использование макросов , особенно макросов execute и process позволяет делать поистине фантастические вещи, которые на чистом pl+ не сделать.
По поводу ошибки. Вообще не вижу проблемы- там же есть отладка в компиляторе. Сотни раз всплывали ошибки при разработке и никогда не было проблемой найти: Включаешь в администраторе словаря продолжительный уровень отладки и читаешь лог.
По сути, макросы execute и process это почти точка доступа(hook) внутрь компилятора. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|