要在多个源文件间共享预编译头文件,这些源文件必须共享一组共同的 include 文件(按其初始标记序列)。标记是指关键字、名称或标点符号。被 #if 指令排除的注释和代码不能被编译器识别为标记。该初始标记序列称为活前缀。也就是说,活前缀是源文件中通用于所有源文件的最靠前的部分。创建预编译头文件并进而确定源文件中哪些头文件是预编译的时,编译器使用此活前缀作为整个操作的依据。
编译器在当前编译期间找到的活前缀必须与用于创建预编译头文件的活前缀匹配。也就是说,必须在使用相同预编译头文件的所有源文件中对活前缀给出一致的解释。
源文件的活前缀只能包含注释和以下任意预处理程序指令:
#include #if/ifdef/ifndef/else/elif/endif #define/undef #ident (if identical, passed through as is) #pragma (if identical)
以上任何指令都可以引用宏。#else、#elif 和 #endif 指令必须在活前缀内匹配。注释被忽略。
指定 -xpch=auto 或 -xpch=autofirst 时,编译器自动确定活前缀的终点,定义如下:
第一个声明/定义
第一个 #line 指令
#pragma hdrstop 指令
在指定的 include 文件之后(如果您指定 -xpch=auto 和 -xpchstop)
第一个 include 文件(如果您指定 -xpch=autofirst)
预处理程序条件编译语句中的终点会生成一个警告,并禁止自动创建预编译头文件。另外,如果同时指定 #pragma hdrstop 和 -xpchstop 选项,编译器将使用两个停止点中较早的那一个来终止活前缀。
对于 -xpch=collect 或 -xpch=use,活前缀以 #pragma hdrstop 结尾。
在共享预编译头文件的每个文件的活前缀中,每个相应的 #define 和 #undef 指令都必须引用相同的符号(例如每个 #define 必须引用同一个值)。这些指令在每个活前缀中出现的顺序也必须相同。每个相应 pragma 也必须相同,并且必须按相同顺序出现在共享预编译头文件的所有文件中。