Си++/Препроцессорные директивы: различия между версиями
Содержимое удалено Содержимое добавлено
→Директива #include: Завершение предыдущей правки. Метки: с мобильного устройства из мобильной версии |
м орфография, стилевые правки, пунктуация, оформление |
||
Строка 3:
Таких команд немного, они все начинаются со знака решётки (<code>#</code>) и должны быть в начале строки исходного кода:
;<code>[[#Директива define|#define]]</code>: эта директива предусматривает определение [[w:макрос|макросов]] или препроцессорных идентификаторов, простейшее применение это замены в тексте программы.
;<code>[[#Директива include|#include]]</code>: позволяет включать текст других файлов в текст вашей программы.
;<code>[[#Директива undef|#undef]]</code>: отменяет действие директивы [[#Директива define|#define]]
;<code>[[#Условные директивы #if, #ifdef, #else, #endif, #elif|#if]]</code>: организация условной обработки директив.
;<code>[[#Условные директивы #if, #ifdef, #else, #endif, #elif|#ifdef]]</code>: организация условной обработки
;<code>[[#Условные директивы #if, #ifdef, #else, #endif, #elif|#else]]</code>: организация условной обработки директив.
;<code>[[#Условные директивы #if, #ifdef, #else, #endif, #elif|#endif]]</code>: организация условной обработки директив.
;<code>[[#Условные директивы #if, #ifdef, #else, #endif, #elif|#elif]]</code>: организация условной обработки директив.
;<code>[[#Директива line|#line]]</code>: управление нумерацией строк в тексте программы.
;<code>[[#Директива error|#error]]</code>:
;<code>[[#Директива pragma|#pragma]]</code>: зависит от среды разработки.
;<code>#</code>: нулевая, или пустая, директива, бездейственно пропускается.
__NOTOC__
===Директива #define===
Директива <code>#define</code> служит для замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. Идентификаторы, заменяющие текстовые или числовые константы, называют именованными константами. Идентификаторы, заменяющие фрагменты программ, называют макроопределениями,
Основная форма синтаксиса директивы <code>#define</code>:
Строка 24:
#define идентификатор текст''
Так например, в программе
#define N 5
Строка 47:
Директива #include информирует препроцессор о том, что содержание файла с заданным именем следует обрабатывать так, как будто оно присутствует в исходной программе в месте расположения этой директивы. Новый текст также может содержать директивы препроцессора. Препроцессор выполняет директивы в новом тексте, а затем продолжает обработку текста исходного файла.
При поиске файлов препроцессор использует концепцию
Препроцессор останавливает поиск сразу же после обнаружения файла с заданным именем. Если задать полную спецификацию файла, заключенную в двойные
Если заключенная в двойные
Вставка файлов может быть вложенной. Т. е. директива #include может появляться в файле, который сам вставляется директивой #include. Файл f2 может вызывать файл f3. В этом случае f1 все еще будет родительским для f2, но
При вложенной вставке файлов поиск
Если спецификация файла заключена в угловые скобки (<code><nowiki>< ></nowiki></code>), то препроцессор не проводит поиска в текущем рабочем каталоге. Поиск файла начинается в
Допускается вложение вставки файлов до 10 уровней. При обработке вложенных #include препроцессор всегда будет осуществлять вставку в первоначальный исходный файл.
===Директива #undef===
Директива #undef удаляет текущее определение идентификатора. Поэтому все встречающиеся появления идентификатора будут игнорироваться предпроцессором. Для удаления определения макро с использованием #undef, нужно задать только идентификатор макро, не задавая список параметров.
Можно применить директиву #undef к идентификатору, у которого нет определения. Тем самым пользователь получает дополнительную гарантию того, что данный идентификатор не
Директива #undef обычно используется в паре с директивой #define для задания области исходной программы, в которой идентификатор имеет специальное значение. Например, некоторая функция исходной программы может иметь объявленные константы, которые задают значения среды работы, которые не влияют на остальную часть программы. Директива #undef также работает с директивой #if для управления условной компиляцией исходной программы.
Строка 72:
===Условные директивы #if, #ifdef, #else, #endif, #elif===
Эти директивы позволяют подавить компиляцию части исходного файла, проверяя постоянное выражение или идентификатор. Результат проверки определяет, какие блоки текста будут переданы в компилятор и какие блоки текста будут удалены из исходного файла при предпроцессорной обработке.
====Условная компиляция====
===Директива #line===
Изменяет внутренний номер строки и имя файла компилятора. Если имя файла опущено, оно остается прежним. Cинтаксис директивы:
#line константа <"имя_файла">
к примеру <code>#line 1000 "file.сpp"</code> устанавливается имя исходного файла file.сpp и текущий номер строки 1000.
Текущий номер строки и имя файла доступны через константы препроцессора __LINE__ и __FILE__.
===Директива #error===
Директива #error
- Синтаксис:▼
#errortoken-string▼
▲ #errortoken-string
Примечание: Сообщение об ошибке, создаваемое этой директивой, содержит параметр token-string. Параметр token-string не подлежит расширению макроса. Эта директива наиболее полезна в ходе предварительной обработки и позволяет уведомлять разработчика о противоречиях в программе или о нарушении ограничений. В следующем примере демонстрируется обработка ошибки во время предварительной обработки.
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
===Директива #pragma===
<nowiki>#</nowiki>pragma это инструкция компилятору, которая определяется реализацией.
Конструкция #pragma в языке Си/Си++ используется для задания дополнительных указаний компилятору. С помощью этих конструкций можно указать как осуществлять выравнивание данных в структурах, запретить выдавать
===Замены в тексте===
|