33.9. Препроцессорные директивы#
33.9. Препроцессорные директивы #
Доступно несколько директив препроцессора, которые изменяют способ,
как препроцессор ecpg
разбирает и обрабатывает файл.
33.9.1. Включая файлы #
Чтобы включить внешний файл в вашу встроенную программу SQL, используйте:
EXEC SQL INCLUDEfilename
; EXEC SQL INCLUDE <filename
>; EXEC SQL INCLUDE "filename
";
Встроенный SQL-препроцессор будет искать файл с именем
,
предварительно обрабатывать его и включать его в полученный C-код. Таким образом,
встроенные SQL-запросы включенного файла обрабатываются правильно.
filename
.h
Препроцессор ecpg
будет искать файл в нескольких каталогах в следующем порядке:
- текущий каталог
/usr/local/include
- Каталог PostgreSQL include, определенный во время сборки (например,
/usr/local/pgsql/include
) /usr/include
Но когда используется EXEC SQL INCLUDE
"
, происходит поиск только в текущем каталоге.
filename
"
В каждом каталоге препроцессор сначала будет искать файл с указанным именем, и если не найдет, то добавит суффикс .h
к имени файла и попытается снова (если указанное имя файла уже имеет такой суффикс).
Обратите внимание, что EXEC SQL INCLUDE
не является тем же самым, что и:
#include <filename
.h>
потому что этот файл не будет подвергаться предварительной обработке SQL-команд.
Естественно, вы можете продолжать использовать директиву C
#include
для включения других заголовочных
файлов.
Примечание
Имя включаемого файла чувствительно к регистру, даже если остальная часть команды EXEC SQL INCLUDE
следует обычным правилам регистрозависимости SQL.
33.9.2. Директивы define и undef #
Аналогично директиве #define
, известной из языка C, встроенный SQL имеет аналогичную концепцию:
EXEC SQL DEFINEname
; EXEC SQL DEFINEname
value
;
Таким образом, вы можете определить имя:
EXEC SQL DEFINE HAVE_FEATURE;
И вы также можете определить константы:
EXEC SQL DEFINE MYNUMBER 12; EXEC SQL DEFINE MYSTRING 'abc';
Используйте undef
, чтобы удалить предыдущее определение:
EXEC SQL UNDEF MYNUMBER;
Конечно, вы можете продолжать использовать версии на C #define
и #undef
в своей встроенной программе SQL. Разница заключается в том, где выполняются ваши определенные значения. Если вы используете EXEC SQL DEFINE
, то препроцессор ecpg
выполняет определения и подставляет значения. Например, если вы напишете:
EXEC SQL DEFINE MYNUMBER 12; ... EXEC SQL UPDATE Tbl SET col = MYNUMBER;
тогда ecpg
уже выполнит подстановку, и ваш компилятор C никогда не увидит никакого имени или идентификатора MYNUMBER
. Обратите внимание, что вы не можете использовать #define
для константы, которую вы собираетесь использовать во встроенном SQL-запросе, потому что в этом случае прекомпилятор встроенного SQL не сможет увидеть это объявление.
Если на командной строке препроцессора ecpg
указано несколько входных файлов, эффекты EXEC SQL DEFINE
и EXEC SQL UNDEF
не распространяются на другие файлы: каждый файл начинается только с символов, определенных переключателями -D
на командной строке.
33.9.3. ifdef, ifndef, elif, else, and endif Директивы #
Вы можете использовать следующие директивы для условной компиляции кода:
EXEC SQL ifdef
#name
;Проверяет
name
и обрабатывает последующие строки, еслиname
было определено с помощьюEXEC SQL define
.name
EXEC SQL ifndef
#name
;Проверяет
name
и обрабатывает последующие строки, еслиname
не было определено с помощьюEXEC SQL define
.name
EXEC SQL elif
#name
;Начинает необязательный альтернативный раздел после директивы
EXEC SQL ifdef
илиname
EXEC SQL ifndef
. Может быть любое количество разделовname
elif
. Строки, следующие послеelif
, будут обработаны, еслиname
было определено и ни один предыдущий раздел того же конструктаifdef
/ifndef
...endif
не был обработан.EXEC SQL else;
#Начинает необязательный, последний альтернативный раздел после директивы
EXEC SQL ifdef
илиname
EXEC SQL ifndef
. Последующие строки будут обработаны, если ни один предыдущий раздел того же конструктаname
ifdef
/ifndef
...endif
не был обработан.EXEC SQL endif;
#Завершает конструкцию
ifdef
/ifndef
...endif
. Последующие строки обрабатываются нормально.
ifdef
/ifndef
...endif
конструкции могут быть вложены друг в друга, до 127 уровней глубины.
Этот пример скомпилирует ровно одну из трех команд SET
TIMEZONE
:
EXEC SQL ifdef TZVAR; EXEC SQL SET TIMEZONE TO TZVAR; EXEC SQL elif TZNAME; EXEC SQL SET TIMEZONE TO TZNAME; EXEC SQL else; EXEC SQL SET TIMEZONE TO 'GMT'; EXEC SQL endif;