34.9. Препроцессорные директивы#
34.9. Препроцессорные директивы
Доступно несколько директив препроцессора, которые изменяют способ,
как препроцессор ecpg разбирает и обрабатывает файл.
34.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, определенный во время сборки (например,
/opt/tantor/db/15/include) /usr/include
Но когда используется EXEC SQL INCLUDE
", происходит поиск только в текущем каталоге.
filename"
В каждом каталоге препроцессор сначала будет искать файл с указанным именем, и если не найдет, то добавит суффикс .h к имени файла и попытается снова (если указанное имя файла уже имеет такой суффикс).
Обратите внимание, что EXEC SQL INCLUDE не является тем же самым, что и:
#include <filename.h>
потому что этот файл не будет подвергаться предварительной обработке SQL-команд.
Естественно, вы можете продолжать использовать директиву C
#include для включения других заголовочных
файлов.
Примечание
Имя включаемого файла чувствительно к регистру, даже если остальная часть команды EXEC SQL INCLUDE следует обычным правилам регистрозависимости SQL.
34.9.2. Директивы define и undef
Аналогично директиве #define, известной из языка C, встроенный SQL имеет аналогичную концепцию:
EXEC SQL DEFINEname; EXEC SQL DEFINEnamevalue;
Таким образом, вы можете определить имя:
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 на командной строке.
34.9.3. ifdef, ifndef, elif, else, and endif Директивы
Вы можете использовать следующие директивы для условной компиляции кода:
EXEC SQL ifdefname;Проверяет
nameи обрабатывает последующие строки, еслиnameбыло определено с помощьюEXEC SQL define.nameEXEC SQL ifndefname;Проверяет
nameи обрабатывает последующие строки, еслиnameне было определено с помощьюEXEC SQL define.nameEXEC SQL elifname;Начинает необязательный альтернативный раздел после директивы
EXEC SQL ifdefилиnameEXEC SQL ifndef. Может быть любое количество разделовnameelif. Строки, следующие послеelif, будут обработаны, еслиnameбыло определено и ни один предыдущий раздел того же конструктаifdef/ifndef...endifне был обработан.EXEC SQL else;Начинает необязательный, последний альтернативный раздел после директивы
EXEC SQL ifdefилиnameEXEC SQL ifndef. Последующие строки будут обработаны, если ни один предыдущий раздел того же конструктаnameifdef/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;