## 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;
```