Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.173.48.18] |
|
Сообщ.
#1
,
|
|
|
Управление опциями компиляции внутри текста программы
Все умеют управлять опциями компилятора внутри программы, через директивы {$X+/-} либо {$OPTIONNAME ON/OFF}. Однако при этом есть одна проблемка: затирается глобальное значение данной опции, установленное в свойствах проекта либо в начале модуля. Какой-то код, расположенный ниже примененного передергивания опции, мог рассчитывать на другое значение; могут появиться непредвиденные посторонние эффекты. Самый очевидный из них - неотлов переполнения чисел или выхода за границы массива в debug версии; но вполне вероятны и более деструктивные и неожиданные последствия. К счастью, есть способ определить, была ли установлена опция, а значит, можно и возвращать ее прежнее значение, и значит, исключить побочные эффекты. Инициализация: запоминаем состояние опции. {$IFOPT R+} {$DEFINE RangeCheckOn} {$ENDIF} Применение: условное включение опции {$R-} ... {$IFDEF RangeCheckOn} {$R+} {$ENDIF} |
Сообщ.
#2
,
|
|
|
обычно определяют два файлика примерно такого вида:
Es.SaveSwitches.inc {$if defined(EsSaveSwitches_Included)} Вложеные инклюды файлов Es.SaveSwitches.inc/Es.RestoreSwitches - НЕ ПОДДЕРЖИВАЮТСЯ {$ifend} {$define EsSaveSwitches_Included} {$IFOPT R+} {$define Es_R_plus} {$endif} {$IFOPT Q+} {$define Es_Q_plus} {$endif} {$IFOPT J+} {$define Es_J_plus} {$endif} {$IFOPT B+} {$define Es_B_plus} {$endif} Es.RestoreSwitches.inc {$if not defined(EsSaveSwitches_Included)} Не был включен файл Es.SaveSwitches.inc {$ifend} {$undef EsSaveSwitches_Included} {$if defined(Es_R_plus)} {$R+} {$undef Es_R_plus} {$else} {$R-} {$ifend} {$if defined(Es_Q_plus)} {$Q+} {$undef Es_Q_plus} {$else} {$Q-} {$ifend} {$if defined(Es_J_plus)} {$J+} {$undef Es_J_plus} {$else} {$J-} {$ifend} {$if defined(Es_B_plus)} {$B+} {$undef Es_B_plus} {$else} {$B-} {$ifend} соответственно пользовательский код примерно так будет выглядить: {I Es.SaveSwitches.inc} {$R-}{$Q-}{$B+} function MyInc(B: Byte): Byte; begin // мой супер пупер код end; {$I Es.ReporeSwitches.inc} |
Сообщ.
#3
,
|
|
|
Если мой вариант рассматривать как отвертку, твой - это навороченный шуруповерт )) для больших проектов, возможно, лучше, для локальных применений - чересчур громоздок.
|