Функции макропроцессора
Распознавать макроопределения, выделяемые псевдокомандами MACRO и ENDM (MEND).
Запомнить определения. Макропроцессор должен запомнить определения макрокоманд, которые он будет использовать для расширения макровызовов.
Распознавать вызовы. Макропроцессор должен распознавать макровызовы, представленные в форме мнемонического кода операции.
Выполнять расширения макрокоманд и подстановку фактических параметров. Вместо формальных параметров макроопределения макропроцессор должен подставить соответствующие операнды макрокоманды.
Таким образом, макропроцессор должен распознавать и обрабатывать макроопределения и макрокоманды.
9.Препроцессор Си
В компилятор языка программирования C входит так называемый препроцессор, который осуществляет подготовку программы к компиляции. Что-то препроцессор делает по-умолчанию, а какие-то его действия программируются с помощью директив .
Оператор (директива) препроцессора - это одна строка исходного текста, начинающаяся с символа #, за которым следуют название оператора (define, pragma, include, if) и операнды. Операторы препроцессора могут появляться в любом месте программы и их действие распространяется на весь исходный файл.
Существуют следующие директивы: 1Подключение файлов: #include, #include_next. 2Условная компиляция: #if, #ifdef, #ifndef, #else, #elif и #endif. 3Диагностика: #error,#warning,#line. 4Дополнительная информация компилятору: #pragma 5 Макроопределения: #define
1)Директива препроцессора include создает копию файла, который в ней указывается, и добавляет его в программу. Есть два варианта включения директивы include:
#include <имя файла>
Поиск этого файла будет вестись в каталоге, где расположены библиотечные файлы.
#include "имя файла"
Встретив в исходнике эту директиву, препроцессор заменяет её на содержимое файла, имя которого указанно в параметре.
2) Применяется, когда в зависимости от значения различных макросов, нужно компилировать, или нет, тот или иной кусок кода, или установить другие макросы. #if <i>условие</i> // код компилируемый если условие истинно. #elif <i>условие2</i> // код компилируемый если условие2 истинно. #else // код компилируемый если ни одно из условий выше не выполнилось #endif
Условие — это выражение препроцессора. Это может быть любая комбинация макросов, условий и целочисленных литералов, которая в результате макроподстановки превратится в выражение состоящее только из целочисленных литералов, арифметических операций и логических операторов.
3) #error — остановить компиляцию с сообщением об ошибке, указанном после директивы. Её можно использовать совместно с директивами условной компиляции для того, чтоб убедиться установлен ли какой-то важный макрос и, что он имеет правильное значение. #warning, аналогична #error, но не прерывает компиляцию, а выдаёт предупреждение.
4) #pragma
Эта директива используется в основном для передачи компилятору различных нестандартных опций, таких как уровни оптимизаций для отдельных частей программы, выравнивания структур, параметров компоновщика и много чего ещё. У каждого компилятора свой набор директив pragma, но есть и стандартные, поддерживаемые многими компиляторами.
#pragma once — нестандартная, но широко распространенная препроцессорная директива, разработанная для контроля за тем, чтобы конкретный исходный файл при компиляции подключался строго один раз.
5) С помощью директивы #define объявляются и определяются так называемые символические константы.
Когда перед компиляцией исходный код будет обработан препроцессором, то все символические константы в тексте исходного кода на языке C будут заменены на соответствующие им числовые или строковые константы.
Для удаления символической константы используют директиву #UNDEF
С помощью директивы #define можно заменять символьными константами не только числовые и строковые константы, но почти любую часть кода:
#define PN printf("\n")
#define SUM for(i=0; i<N; i++) sum += i
