Директивы Препроцессора
Директивы препроцессора представляют собой инструкции, записанные в тексте программы на СИ, и выполняемые до трансляции программы. Директивы препроцессора позволяют изменить текст программы, например, заменить некоторые лексемы в тексте, вставить текст из другого файла, запретить трансляцию части текста и т.п. Все директивы препроцессора начинаются со знака #. После директив препроцессора точка с запятой не ставятся.
1.8.1. Директива #include
Директива #include включает в текст программы содержимое указанного файла. Эта директива имеет две формы:
#include "имя файла" #include
Имя файла должно соответствовать соглашениям операционной системы и может состоять либо только из имени файла, либо из имени файла с предшествующим ему маршрутом. Если имя файла указано в кавычках, то поиск файла осуществляется в соответствии с заданным маршрутом, а при его отсутствии в текущем каталоге. Если имя файла задано в угловых скобках, то поиск файла производится в стандартных директориях операционной системы, задаваемых командой PATH.
Директива #include может быть вложенной, т.е. во включаемом файле тоже может содержаться директива #include, которая замещается после включения файла, содержащего эту директиву.
Директива #include широко используется для включения в программу так называемых заголовочных файлов, содержащих прототипы библиотечных функций, и поэтому большинство программ на СИ начинаются с этой директивы.
1.8.2. Директива #define
Директива #define служит для замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. Идентификаторы, заменяющие текстовые или числовые константы, называют именованными константами. Идентификаторы, заменяющие фрагменты программ, называют макроопределениями, причем макроопределения могут иметь аргументы.
Директива #define имеет две синтаксические формы:
#define идентификатор текст #define идентификатор (список параметров) текст
Эта директива заменяет все последующие вхождения идентификатора на текст. Такой процесс называется макроподстановкой. Текст может представлять собой любой фрагмент программы на СИ, а также может и отсутствовать. В последнем случае все экземпляры идентификатора удаляются из программы.
#define WIDTH 80 #define LENGTH (WIDTH+10)
Эти директивы изменят в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками.
Скобки, содержащиеся в макроопределении, позволяют избежать недоразумений, связанных с порядком вычисления операций. Например, при отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в выражение t=(80+10)*7, как это получается при наличии скобок, и в результате получится 780, а не 630.
Во второй синтаксической форме в директиве #define имеется список формальных параметров, который может содержать один или несколько идентификаторов, разделенных запятыми. Формальные параметры в тексте макроопределения отмечают позиции на которые должны быть подставлены фактические аргументы макровызова. Каждый формальный параметр может появиться в тексте макроопределения несколько раз.
При макровызове вслед за идентификатором записывается список фактических аргументов, количество которых должно совпадать с количеством формальных параметров.
Пример: #define MAX(x,y) ((x)>(y))?(x):(y) Эта директива заменит фрагмент t=MAX(i,s[i]); на фрагмент t=((i)>(s[i])?(i):(s[i]);
Как и в предыдущем примере, круглые скобки, в которые заключены формальные параметры макроопределения, позволяют избежать ошибок связанных с неправильным порядком выполнения операций, если фактические аргументы являются выражениями.
Например, при наличии скобок фрагмент t=MAX(i&j,s[i]||j); будет заменен на фрагмент t=((i&j)>(s[i]||j)?(i&j):(s[i]||j); а при отсутствии скобок - на фрагмент t=(i&j>s[i]||j)?i&j:s[i]||j; в котором условное выражение вычисляется в совершенно другом порядке.
1.8.3. Директива #undef
Директива #undef используется для отмены действия директивы #define. Синтаксис этой директивы следующий #undef идентификатор
Директива отменяет действие текущего определения #define для указанного идентификатора. Не является ошибкой использование директивы #undef для идентификатора, который не был определен директивой #define.
#undef WIDTH #undef MAX
Эти директивы отменяют определение именованной константы WIDTH и макроопределения MAX.
Что такое директива в программировании
Директива #define
#define это удобная директива, который позволяет дать имя константе перед тем как программа будет скомпилирована. Определенные этой директивой константы не занимают программной памяти, поскольку компилятор заменяет все обращения к ним их значениями на этапе компиляции, соответственно они служат исключительно для удобства программиста и улучшения читаемости текста программы.
Стоит упомянуть о некотором нежелательном эффекте, который может иметь место при использовании директивы #define. Например, если имя константы, заданное с помощью директивы #define включить в имя другой константы или переменной, то оно будет заменено на свое значение.
В общем случае рекомендуется использовать выражение const для определения констант вместо #define
Синтаксис для Arduino такой же как и для C:
Синтаксис:
#define constantName value
Внимание! Символ # перед словом define обязателен.
Пример
#define ledPin 3 // компилятор заменит любое упоминание ledPin на занчение 3 во время компиляции
Замечание по использованию
Обратите внимание, что точка с запятой не ставится, иначе компилятор выдаст критическую ошибку.
#define ledPin 3; // это ошибка, ; здесь не нужна
Точно так же знак равно после имени константы тоже вызовет критическую ошибку компилятора.
#define ledPin = 3 // это тоже ошибка, знак = не нужен
Директивы
Директива (указание) по использованию похожа на какую-либо команду, так как также используется для описания некоторых конструкций языка программирования, т.е. указаний компилятору особенностей обработки при компиляции.
В языки программирования С++ и C++ Builder встроена поддержка препроцессора. Строки в исходном коде, которые должны быть обработаны препроцессором в виде #define и #include называются препроцессорными директивами.
Минутка юмора
В программисте со стажем слиты все профессии мира, правда, понемногу.
Самое интересное
- Log – натуральный логарифм
- ShellExecute – открыть папку или приложение
- Pow – возведение числа в степени
- StringGrid – таблица строк и столбцов
- Chart – графики и диаграммы
17. Директивы препроцессора
Директивы препроцессора – это особые инструкции, которые записаны в тексте программы на СИ и выполнены до трансляции программы. Директивы препроцессора дают возможность изменить текст программы. Среди таких действий – замена некоторых лексем в тексте, вставка текста из другого файла, запрет на трансляцию части текста и т. п. Все директивы препроцессора должны начинаться со знака #. После директив препроцессора точки с запятой быть не должно.
Директива #include включает в программу содержимое определенного файла. Эта директива может быть представлена в двух формах:
#include «имя файла» #include
Имя файла должно соответствовать соглашениям операционной системы. Оно может включать в себя либо только имя файла, либо имя файла с предшествующим ему маршрутом. Когда имя файла указано в кавычках, то поиск файла производится по заданному маршруту, а при его отсутствии – в текущем каталоге. Когда имя файла задано в угловых скобках, поиск файла осуществляется в обычных директориях операционной системы, которые задаются командой PATH.
Директива #include может являться вложенной, т. е. во включаемом файле тоже может содержаться директива #include, способная замещаться после включения файла, содержащего эту директиву.
Директива #include часто применяется для включения в программу так называемых заголовочных файлов, которые содержат прототипы библиотечных функций, и поэтому чаще всего программы на СИ начинаются с этой директивы.
Директива #define применяется для замены часто использующихся констант, ключевых слов, операторов или выражений определенными идентификаторами. Идентификаторы, которые заменяют текстовые или числовые константы, называются именованными константами. Идентификаторы, которые заменяют фрагменты программ, называют макроопределениями, при этом макроопределения могут иметь аргументы.
Директива #define может быть записана в двух синтаксических формах:
#define идентификатор текст
#define идентификатор (список параметров) текст
Данная директива заменяет все дальнейшие вхождения идентификатора на текст. Подобный процесс называется макроподстановкой. Текст может быть любым фрагментом программы на СИ, а также может и отсутствовать.
Данный текст является ознакомительным фрагментом.
Продолжение на ЛитРес
Читайте также
Использование директивы typedef
Использование директивы typedef Разработчики ядра не любят определять новые типы с помощью оператора typedef, и причины этого довольно трудно объяснить. Разумное объяснение может быть следующим.• Определение нового типа через оператор typedef скрывает истинный вид структур
9.3.1. HTTP-директивы
9.3.1. HTTP-директивы При подключении к Интернету пользователи первым делом стремятся загрузить Web-страничку. Если используется proxy, то необходимо правильно настроить HTTP-протокол. Для решения этой задачи в squid есть следующие директивы:? http_port n — параметр n определяет номер
9.3.2. FTP-директивы
9.3.2. FTP-директивы Для работы по FTP-протоколу тоже есть несколько директив:? ftp_passive параметр — режим работы. Если в качестве параметра указано значение on, то разрешен пассивный режим (устанавливается по умолчанию).Сервер squid позволяет работать с FTP-протоколом, но может
10.3.4. Информационные директивы
10.3.4. Информационные директивы Эти директивы отвечают за информационные сообщения, которые видит пользователь, работая с вашим FTP-сервером:? banner имя — в качестве имени можно указать текстовый файл, содержимое которого будет передано пользователю во время входа в систему.
16.3.1. Общие директивы
16.3.1. Общие директивы Общие директивы изменяют глобальные параметры сервера — его имя, тип, порт, адрес администратора. Значения, указанные глобальными директивами, влияют на работу всего сервера.? ServerName — директива, которая определяет имя сервера Apache. Здесь должно быть
16.3.2. Директивы протоколирования
16.3.2. Директивы протоколирования Директивы протоколирования управляют процессом протоколирования работы сервера. С их помощью вы можете определить, что нужно записывать в журналы, а что — нет.? HostnameLookups on | off. Сервер Apache ведет журнал доступа других компьютеров. Если вы
16.3.9. Директивы перенаправления
16.3.9. Директивы перенаправления Довольно часто нужно перенаправить пользователя на другой ресурс: например, вы сменили хостера и из-за этого изменилось имя вашего сайта. Обычно при таком «переезде» у вас есть определенное время, чтобы сообщить вашим пользователям об
21.1.4. Опции препроцессора
21.1.4. Опции препроцессора Эти опции задают режим предварительной обработки исходного кода (до собственно компиляции).Очень важной является опция -include <файл>. Она позволяет «прогнать» через препроцессор сперва содержимое указанного файла, а только после этого файл,
3. Директивы сегментации
3. Директивы сегментации В ходе предыдущего обсуждения мы выяснили все основные правила записи команд и операндов в программе на ассемблере. Открытым остался вопрос о том, как правильно оформить последовательность команд, чтобы транслятор мог их обработать, а
17. Директивы препроцессора
17. Директивы препроцессора Директивы препроцессора – это особые инструкции, которые записаны в тексте программы на СИ и выполнены до трансляции программы. Директивы препроцессора дают возможность изменить текст программы. Среди таких действий – замена некоторых
Директивы препроцессора C#
Директивы препроцессора C# Подобно многим другим языкам из семейства C, в C# поддерживаются различные символы, позволяющие влиять на процесс компиляции. Перед рассмотрением директив препроцессора C# согласуем соответствующую терминологию. Термин «директива препроцессора
Директивы и атрибуты CIL
Директивы и атрибуты CIL Теперь, когда вы знаете, как использовать ildasm.exe и ilasm.exe в рамках челночной технологии разработки, мы можем заняться непосредственным анализом синтаксиса и семантики CIL. Следующие разделы предлагают описание процесса построения пользовательского
ДИРЕКТИВЫ ПРЕПРОЦЕССОРА #define, #include, #undef, #if, #ifdef, #ifndef, #else, #endif
ДИРЕКТИВЫ ПРЕПРОЦЕССОРА #define, #include, #undef, #if, #ifdef, #ifndef, #else, #endif Язык Си был разработан в помощь работающим программистам, а им нравится его препроцессор. Этот полезный помощник просматривает программу до компилятора (отсюда и термин «препроцессор») и заменяет
ДИРЕКТИВЫ ПРЕПРОЦЕССОРА И УКАЗАНИЯ КОМПИЛЯТОРУ
ДИРЕКТИВЫ ПРЕПРОЦЕССОРА И УКАЗАНИЯ КОМПИЛЯТОРУ Введение Препроцессор языка Си представляет собой макропроцессор, используемый для обработки исходного файла на нулевой фазе компиляции. Компилятор языка Си сам вызывает препроцессор, однако препроцессор может быть
8.6.3. Using-директивы
8.6.3. Using-директивы Пространства имен появились в стандартном С++. Предыдущие версии С++ их не поддерживали, и, следовательно, поставляемые библиотеки не помещали глобальные объявления в пространства имен. Множество программ на С++ было написано еще до того, как
49. Директивы сегментации
49. Директивы сегментации Сегментация является частью более общего механизма, связанного с концепцией модульного программирования. Она предполагает унификацию оформления объектных модулей, создаваемых компилятором, в том числе с разных языков программирования. Это