- •1) Принципы фон Неймана
- •2) Общая схема устройства компьютера
- •5) Структура программы на Паскале. Используемые в языке символы. Идентификаторы, ключевые слова, комментарии.
- •12) Массивы
- •15) Назначение параметров
- •16. Локальные, глобальные переменные. Время жизни и область видимости переменных;
- •18 Cтруктуры в си
- •19. Основные директивы препроцессора. Компиляция, линковка;
- •4.2.2. Директива define
- •20. Стандартная библиотека с:
4.2.2. Директива define
Директива define служит для замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами - макросами. Идентификаторы, заменяющие текстовые или числовые константы, называют именованными или символическими константами. Идентификаторы, заменяющие фрагменты программ, называют макроопределениями, причем макроопределения могут иметь аргументы.
Директива define имеет две синтаксические формы:
#define идентификатор текст
#define идентификатор (список параметров) текст
Эта директива заменяет все последующие вхождения идентификатора текстом. Такой процесс называется макроподстановкой. Текст может представлять собой любой фрагмент программы на C, а может и отсутствовать вовсе. В последнем случае все экземпляры идентификатора удаляются из программы.
Идентификатор (макрос) в директиве define принято записывать прописными буквами:
#define WIDTH 80
#define LENGTH (WIDTH+10)
Эти директивы изменят в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками.
Скобки, содержащиеся в макроопределении, позволяют избежать недоразумений, связанных с порядком выполнения операций. Так, при отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в выражение t=(80+10)*7, как это получается при наличии скобок, и в результате вычислений получится число 150, а не 630.
Во второй синтаксической форме в директиве define имеется список формальных параметров, который может содержать один или несколько идентификаторов, разделенных запятыми. Формальные параметры в тексте макроопределения отмечают позиции, на которые должны быть подставлены фактические аргументы макровызова. Каждый формальный параметр может появиться в тексте макроопределения несколько раз. При макровызове вслед за идентификатором записывается список фактических аргументов, количество которых должно совпадать с количеством формальных параметров.
Пример макроопределения:
#define SQUARE(X) (X)*(X)
Отметим, что скобки необходимы (как и в предыдущем примере) для обеспечения правильного порядка действий.
Теперь при появлении в программе выражения Z=SQUARE(2); переменная Z получит значение, равное 4.
Следует иметь в виду, что препроцессор не выполняет проверки синтаксической правильности текста подстановки, поэтому использование конструкции
#define PI = 3.1415
приведет к тому, что вместо идентификатораPI везде будет подставляться текст "= 3.1415", что явно не соответствует желаемому. Ошибка будет обнаружена только на этапе компиляции.
КОМПИЛЯЦИЯ (compilation) — трансляция программы (кода) или отдельного программного модуля, составленных на языке программирования высокого уровня (исходная программа, исходный модуль) в программу или модуль на машинном языке или языке, близком к машинному (объектная программа, объектный модуль). В процессе К. программа преобразуется в промежуточную форму, к которой впоследствии необходимо присоединить библиотечные средства, содержащие стандартные подпрограммы и процедуры, а если нужно, то можно добавить любые другие модули, написанные самим пользователем, и скомпилированные в объектные модули, возможно, с иных языков высокого уровня.
В разработке программного обеспечения, компоновщик (также реда́ктор свя́зей, линкер — от англ. link editor, linker) — программа, которая производит компоновку: принимает на вход один или несколькообъектных модулей и собирает по ним исполнимый модуль.
Для связывания модулей компоновщик использует таблицы имён, созданные компилятором в каждом из объектных модулей. Такие имена могут быть двух типов:
• Определённые или экспортируемые имена — функции и переменные, определённые в данном модуле и предоставляемые для использования другим модулям
• Неопределённые или импортируемые имена — функции и переменные, на которые ссылается модуль, но не определяет их внутри себя
Работа компоновщика заключается в том, чтобы в каждом модуле определить и связать ссылки на неопределённые имена. Для каждого импортируемого имени находится его определение в других модулях, упоминание имени заменяется на его адрес.
Компоновщик обычно не выполняет проверку типов и количества параметров процедур и функций. Если надо объединить объектные модули программ, написанные на языках со строгой типизацией, то необходимые проверки должны быть выполнены дополнительной утилитой перед запуском редактора связей.