Twitter LinkedIn Facebook Адрес электронной почты
Директивы препроцессора, такие как
и #ifdef
, обычно используются для упрощения изменения и компиляции исходных программ в разных средах выполнения. Директивы в исходном файле указывают препроцессору на необходимость выполнения определенных действий. Например, препроцессор может заменять токены в тексте, вставлять содержимое других файлов в файл исходного кода или отключать компиляцию части файла путем удаления разделов текста. Строки препроцессора распознаются и выполняются до расширения макросов. Таким образом, если макрос разворачивается в нечто, похожее на команду препроцессора, оно не распознается препроцессором.
Инструкции препроцессора используют тот же набор символов, что и инструкции исходного файла, за исключением того, что escape-последовательности не поддерживаются. Набор символов в операторах препроцессора совпадает с кодировкой выполнения. Препроцессор также распознает отрицательные значения символов.
Препроцессор распознает следующие директивы:
#define
#elif
#else
#endif
#error
#if
#ifdef
#ifndef
#import
#include
#line
#pragma
#undef
#using
Знак решетки ( #
) должен быть первым символом, не пробелом, в строке, содержащей директиву. Символы пробела могут находиться между знаком номера и первой буквой директивы. Некоторые директивы содержат аргументы или значения. Любой текст, следующий за директивой (за исключением аргумента или значения, который является частью директивы), должен предшествовать разделителю однострочных комментариев ( //
) или заключены в разделители комментариев ( /* */
\
).Директивы препроцессора могут находиться в любом месте исходного файла, но они применяются только к остальной части исходного файла после их появления.
Операторы препроцессора
Предустановленные макросы
Справочник по препроцессору c/c++
RU
EN
RU EN
Препроцессор ecpg
поддерживает ряд директив, которые позволяют управлять разбором и обработкой исходных файлов.
Для включения внешнего файла в программу со встраиваемым SQL, используется конструкция:
EXEC SQL INCLUDEимя_файла
; EXEC SQL INCLUDE <имя_файла
>; EXEC SQL INCLUDE "имя_файла
";
Встретив такую директиву, препроцессор встраиваемого SQL будет искать файл
, обрабатывать его и включать в выходной код C. В результате встраиваемые SQL-операторы во включённом таким образом файле будут обработаны корректно.имя_файла
.h
Препроцессор ecpg
будет искать указанный файл в нескольких каталогах в следующем порядке:
/usr/local/include
/usr/local/pgsql/include
)/usr/include
Но когда используется форма EXEC SQL INCLUDE "
, просматривается только текущий каталог.имя_файла
"
В каждом каталоге препроцессор будет сначала искать файл с заданным именем, а если не обнаружит его, попытается найти файл с добавленным расширением .h
(если только заданное имя файла уже не содержит это расширение).
Заметьте, что команда EXEC SQL INCLUDE
не равнозначна включению:
#include <имя_файла
.h>
так как во втором случае включаемый файл не проходит через препроцессор SQL-команд. Естественно, директиву C #include
можно по-прежнему применять для включения других заголовочных файлов.
Имя включаемого файла чувствительно к регистру, несмотря на то, что остальная команда EXEC SQL INCLUDE
подчиняется обычным правилам чувствительности к регистру SQL.
Во встраиваемом SQL есть конструкция, подобная директиве #define
, известной в C:
EXEC SQL DEFINEимя
; EXEC SQL DEFINEимя
значение
;
Используя её, можно определить имя:
EXEC SQL DEFINE HAVE_FEATURE;
И также можно определить константы:
EXEC SQL DEFINE MYNUMBER 12; EXEC SQL DEFINE MYSTRING 'abc';
Удалить предыдущее определение позволяет команда undef
:
EXEC SQL UNDEF MYNUMBER;
Разумеется, в программе со встраиваемым SQL можно продолжать использовать версии #define
и #undef
языка C. Отличие состоит в том, когда вычисляются определяемые значения. Когда применяется команда EXEC SQL DEFINE
, вычислять определения и подставлять значения будет препроцессор ecpg
. Например, если написать:
EXEC SQL DEFINE MYNUMBER 12; ... EXEC SQL UPDATE Tbl SET col = MYNUMBER;
подстановку выполнит ecpg
и компилятор C никогда не увидит имени или идентификатора MYNUMBER
. Заметьте, что с другой стороны
не подходит для определения константы, которую вы хотите использовать во встраиваемом SQL, так как препроцессор встраиваемого SQL не сможет увидеть это определение.
Для условной компиляции блоков кода можно использовать следующие указания:
EXEC SQL ifdef имя
;
Проверяет имя
и обрабатывает последующие строки, если имя
было определено командой EXEC SQL define
.имя
EXEC SQL ifndef имя
;
Проверяет имя
и обрабатывает последующие строки, если имя
не было определено командой EXEC SQL define
.имя
EXEC SQL else;
Начинает альтернативную ветвь условия, открытого командой EXEC SQL ifdef
или имя
EXEC SQL ifndef
.имя
EXEC SQL elif имя
;
Проверяет имя
и начинает альтернативную ветвь условия, если имя
было определено командой EXEC SQL define
.имя
EXEC SQL endif;
Завершает ветвь условия.
Пример:
EXEC SQL ifndef TZVAR; EXEC SQL SET TIMEZONE TO 'GMT'; EXEC SQL elif TZNAME; EXEC SQL SET TIMEZONE TO TZNAME; EXEC SQL else; EXEC SQL SET TIMEZONE TO TZVAR; EXEC SQL endif;
Редактировать
Твиттер LinkedIn Фейсбук Электронная почта
Директивы препроцессора, такие как #define
и #ifdef
, обычно используются для облегчения изменения и компиляции исходных программ в различных средах выполнения. Директивы в исходном файле указывают препроцессору выполнять определенные действия. Например, препроцессор может заменить токены в тексте, вставить содержимое других файлов в исходный файл или подавить компиляцию части файла, удалив участки текста. Строки препроцессора распознаются и выполняются перед расширением макроса. Поэтому, если макрос превращается во что-то похожее на команду препроцессора, он не распознает его.
Операторы препроцессора используют тот же набор символов, что и операторы исходного файла, за исключением того, что управляющие последовательности не поддерживаются. Набор символов, используемый в операторах препроцессора, совпадает с набором символов выполнения. Препроцессор также распознает отрицательные значения символов.
Препроцессор распознает следующие директивы:
#define
#elif
#else
#endif
#ошибка
#if
#ifdef
#ifndef
#import
#include
#line
#pragma
#undef
# использование
Знак числа ( #
) должен быть первым непробельным символом в строке, содержащей директиву. Между знаком номера и первой буквой директивы могут появляться пробельные символы. Некоторые директивы включают аргументы или значения. Любому тексту, который следует за директивой (за исключением аргумента или значения, являющегося частью директивы), должен предшествовать однострочный разделитель комментария (
) или заключены в разделители комментариев ( /* */
). Строки, содержащие директивы препроцессора, могут быть продолжены, если непосредственно перед маркером конца строки поставить обратную косую черту ( \
).
Директивы препроцессора могут появляться в любом месте исходного файла, но они применяются только к остальной части исходного файла после их появления.
Операторы препроцессора
Предопределенные макросы
Справочник по препроцессору c/c++
Просмотреть все отзывы о странице
Язык C++
Препроцессор
9 0016 Препроцессор выполняется на этапе трансляции 4 перед компиляцией. Результатом предварительной обработки является один файл, который затем передается фактическому компилятору.
|
Директивы препроцессора управляют поведением препроцессора. Каждая директива занимает одну строку и имеет следующий формат:
Директивы модуля и импорта также являются директивами предварительной обработки. | (начиная с C++20) |
Директивы предварительной обработки не должны исходить из раскрытия макросов.
#define ПУСТОЙ EMPTY # include// не директива препроцессора
Препроцессор имеет возможности перевода исходного файла:
Можно управлять следующими аспектами препроцессора: