На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Друзья, соблюдайте, пожалуйста, правила форума и данного раздела:
Данный раздел не предназначен для вопросов и обсуждений, он содержит FAQ-заготовки для разных языков программирования. Любой желающий может разместить здесь свою статью. Вопросы же задавайте в тематических разделах!
• Если ваша статья может быть перенесена в FAQ соответствующего раздела, при условии, что она будет оформлена в соответствии с Требованиями к оформлению статей.
• Чтобы остальным было проще понять, указывайте в описании темы (подзаголовке) название языка в [квадратных скобках]!
Модераторы: Модераторы
  
> (Компилятор) Управление опциями компиляции , [Delphi] внутри текста программы, не затрагивая общие настройки
    Управление опциями компиляции внутри текста программы

    Все умеют управлять опциями компилятора внутри программы, через директивы {$X+/-} либо {$OPTIONNAME ON/OFF}. Однако при этом есть одна проблемка: затирается глобальное значение данной опции, установленное в свойствах проекта либо в начале модуля. Какой-то код, расположенный ниже примененного передергивания опции, мог рассчитывать на другое значение; могут появиться непредвиденные посторонние эффекты. Самый очевидный из них - неотлов переполнения чисел или выхода за границы массива в debug версии; но вполне вероятны и более деструктивные и неожиданные последствия.
    К счастью, есть способ определить, была ли установлена опция, а значит, можно и возвращать ее прежнее значение, и значит, исключить побочные эффекты.

    Инициализация: запоминаем состояние опции.
    ExpandedWrap disabled
      {$IFOPT R+}
        {$DEFINE RangeCheckOn}
      {$ENDIF}


    Применение: условное включение опции
    ExpandedWrap disabled
      {$R-}
        ...
      {$IFDEF RangeCheckOn}
        {$R+}
      {$ENDIF}
    Сообщение отредактировано: Fr0sT -
      обычно определяют два файлика примерно такого вида:

      Es.SaveSwitches.inc
      ExpandedWrap disabled
        {$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
      ExpandedWrap disabled
        {$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}


      соответственно пользовательский код примерно так будет выглядить:

      ExpandedWrap disabled
        {I Es.SaveSwitches.inc}
        {$R-}{$Q-}{$B+}
        function MyInc(B: Byte): Byte;
        begin
          // мой супер пупер код
        end;
        {$I Es.ReporeSwitches.inc}
        Если мой вариант рассматривать как отвертку, твой - это навороченный шуруповерт )) для больших проектов, возможно, лучше, для локальных применений - чересчур громоздок.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0593 ]   [ 16 queries used ]   [ Generated: 19.03.24, 03:32 GMT ]