## 36.9.预处理器指令 [36.9.1. 包括文件](ecpg-preproc.html#ECPG-INCLUDE) [36.9.2. define和undef指令](ecpg-preproc.html#ECPG-DEFINE) [36.9.3. ifdef、ifndef、elif、else和endif指令](ecpg-preproc.html#ECPG-IFDEF) 可以使用几个预处理器指令来修改`ecpg`预处理器解析并处理文件。 ### 36.9.1.包括文件 要在嵌入式SQL程序中包含外部文件,请使用: ``` EXEC SQL INCLUDE filename; EXEC SQL INCLUDE ; EXEC SQL INCLUDE "filename"; ``` 嵌入式SQL预处理器将查找名为`*`文件名`*h`,对其进行预处理,并将其包含在生成的C输出中。因此,可以正确处理包含文件中的嵌入式SQL语句。 这个`ecpg`预处理器将按以下顺序在多个目录中搜索文件: - 当前目录 - `/usr/本地/包括` - PostgreSQL包含目录,在构建时定义(例如。,`/usr/local/pgsql/include`) - `/usr/包括` 但是什么时候`EXEC SQL INCLUDE“*`文件名`*"`则只搜索当前目录。 在每个目录中,预处理器将首先查找给定的文件名,如果找不到,将追加`H`添加到文件名,然后重试(除非指定的文件名已具有该后缀)。 注意`EXEC SQL包括`是*不*一样: ``` #include ``` 因为该文件不受SQL命令预处理的约束。当然,您可以继续使用C`#包括`指令以包含其他头文件。 ### 笔记 include文件名区分大小写,尽管`EXEC SQL包括`命令遵循正常的SQL区分大小写规则。 ### 36.9.2.define和undef指令 与指令类似`#定义`从C语言中可以看出,嵌入式SQL有一个类似的概念: ``` EXEC SQL DEFINE name; EXEC SQL DEFINE name value; ``` 所以你可以定义一个名字: ``` EXEC SQL DEFINE HAVE_FEATURE; ``` 你也可以定义常数: ``` EXEC SQL DEFINE MYNUMBER 12; EXEC SQL DEFINE MYSTRING 'abc'; ``` 使用`未定义`要删除以前的定义,请执行以下操作: ``` EXEC SQL UNDEF MYNUMBER; ``` 当然,您可以继续使用C版本`#定义`和`#未定义`在嵌入式SQL程序中。不同之处在于对定义的值进行评估的地方。如果你使用`EXEC SQL定义`然后`ecpg`预处理器评估定义并替换值。例如,如果你写: ``` EXEC SQL DEFINE MYNUMBER 12; ... EXEC SQL UPDATE Tbl SET col = MYNUMBER; ``` 然后`ecpg`将已经进行替换,并且您的C编译器将永远不会看到任何名称或标识符`我的号码`.请注意,您不能使用`#定义`对于将在嵌入式SQL查询中使用的常量,因为在这种情况下,嵌入式SQL预编译器无法看到此声明。 ### 36.9.3.ifdef、ifndef、elif、else和endif指令 可以使用以下指令有条件地编译代码段: `execsqlifdef*`名称`*;` 检查*`名称`*如果需要,则处理后续行*`名称`*已通过定义`EXEC SQL定义*`名称`*`. `EXEC SQL ifndef*`名称`*;` 检查*`名称`*如果需要,则处理后续行*`名称`*有*不*已通过定义`EXEC SQL定义*`名称`*`. `execsqlelif*`名称`*;` 在`execsqlifdef*`名称`*`或`EXEC SQL ifndef*`名称`*`指令。任何数量的`否则如果`部分可以出现。在一个`否则如果`将被处理,如果*`名称`*已经定义了*和*之前没有相同的章节`条件编译`/`如果未定义`...`恩迪夫`构造已被处理。 `EXEC SQL else;` 开始一个可选的、最终的可选部分`execsqlifdef*`名称`*`或`EXEC SQL ifndef*`名称`*`指令。如果没有相同的前一部分,将处理后续行`条件编译`/`如果未定义`...`恩迪夫`构造已被处理。 `EXEC SQL endif;` 结束`条件编译`/`如果未定义`...`恩迪夫`建筑后续行正常处理。 `条件编译`/`如果未定义`...`恩迪夫`构造可以嵌套,最深可达127层。 本例将编译三个示例中的一个`设定时区`命令: ``` 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; ```