36. Макродирективы условной генерации.

Директивы компиляции по условию позволяют проанализировать определенные условия в ходе генерации макрорасширения и при необходимости изменить этот процесс. Директивы компиляции по условию предназначены для выборочной трансляции фрагментов программного кода. Это означает, что в макрорасширение включаются не все строки макроопределения, а только те, которые удовлетворяют определенным условиям. Всего имеются 12 условных директив компиляции. Их логично попарно объединить в пять групп:

  • IF и IFEусловная трансляция по результату вычисления логического выражения (логическое выражение считается ложным, если оно содержит нули во всех двоичных разрядах, и истинным в противном случае);
     IF(E) логическое_выражение 
    фрагмент_программы_1 
    ELSE 
    фрагмент_программы_2 
    ENDIF
    

    Если в директиве IF логическое выражение истинно, то в объектный модуль помещается первый фрагмент программы. Если ложно, то при наличии директивы ELSE, помещается второй фрагмент программы. IFE аналогично директиве IF анализирует значение логического выражения. Но теперь для включения первого фрагмента программы в объектный модуль требуется, чтобы логическое выражение было ложным.

  • IFDEF и IFNDEFусловная трансляция по факту определения символического имени;
    IFDEF проверяет, описано или нет в программе символическое имя, и если это так, то в объектный модуль помещается первый фрагмент программы. В противном случае при наличии директивы ELSE в объектный код помещается второй фрагмент программы. IFNDEF действует обратным образом – если имя не определено.
  • IFB и IFNBусловная трансляция по факту определения фактического аргумента при вызове макрокоманды;
    IFB проверяет равенство аргумента пробелу. В качестве аргумента могут выступать имя или число. Если его значение равно пробелу (то есть фактический аргумент при вызове макрокоманды не был задан), то транслируется и помещается в объектный модуль первый фрагмент программы. IFNB действует обратным образом – если аргумент задан
  • IFIDN, IFIDNI, IFDIF и IFDIFI условная трансляция по результату сравнения строк символов.
    IFIDN(I) аргумент_1,аргумент_2 
    фрагмент_программы_1 
    ELSE 
    фрагмент_программы_2 
    ENDIF 
    

    IFIDN сравнивает символьные значения аргумент_1 и аргумент_2. Если результат сравнения положительный, то помещается в объектный модуль первый фрагмент программы. IFDIF действует обратным образом – если результат сравнения отрицательный. Варианты IFIDNI, IFDIFI отличаются только тем, что не учитывают различия строчных и прописных букв (ah = AH)

  • IF1, IF2
    IF1 – истина, если макрос вызван первый раз, IF2 – истина, если макрос вызван второй раз

В формировании логических выражений для директив условной условной компиляции, можно использовать операторы отношений (EQ(=), NE(!=), LT(<), LE(<=), GT(>), GE(>=)) и логические операторы (NOT, AND, OR, XOR)

17.07.2015