31.12. Preprocessor directives #
31.12.1. Including files
要在嵌入式 SQL 程序中包含外部文件,可使用:
EXEC SQL INCLUDE filename;
嵌入式 SQL 预处理器会查找名为的文件,对它进行预处理,并将其包含在生成的 C 输出中。这样,被包含文件中的嵌入式 SQL 语句就能得到正确处理。
filename.h
注意这不同于:
#include <filename.h>
因为这样包含的文件不会经过 SQL 命令预处理。当然,仍可使用 C 的#include指令包含其他头文件。
注意
被包含文件的名称区分大小写,尽管EXEC SQL INCLUDE命令的其他部分遵循通常的 SQL 大小写规则。
31.12.2. The #define and #undef directives
与 C 中我们熟知的指令#define相似,嵌入式 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;
当然在你的嵌入式 SQL 程序中你可以继续使用 C 版本的#define和#undef。区别在于你定义的值会在哪里被计算。如果你使用EXEC SQL DEFINE,那么 ecpg 预处理器会计算这些定义并且替换值。例如,如果你写:
EXEC SQL DEFINE MYNUMBER 12; ... EXEC SQL UPDATE Tbl SET col = MYNUMBER;
那么ecpg 将已经做过替换并且你的 C 编译器将永远不会看见名为MYNUMBER的任何名称或标识符。注意你不能把#define用于一个将要在一个嵌入式 SQL 查询中使用的常量,因为在这种情况下嵌入式 SQL 预处理器不能看到这个声明。
31.12.3. ifdef, ifndef, else, elif, and endif directives
可以使用以下指令对代码区段进行条件编译:
EXEC SQL ifdefname;检查
name,如果已通过EXEC SQL define创建了namename,就处理后续各行。EXEC SQL ifndefname;检查
name,如果尚未通过EXEC SQL define创建namename,就处理后续各行。EXEC SQL else;开始处理一个备选区段,对应由
EXEC SQL ifdef或nameEXEC SQL ifndef引入的区段。nameEXEC SQL elifname;检查
name,如果已通过EXEC SQL define创建了namename,就开始一个备选区段。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;