include_alias
pragma
指定在 #include
指令中找到 alias_filename 时,编译器在其原位置替换 actual_filename。
语法
#pragma include_alias(
"alias_filename",
"actual_filename")
#pragma include_alias(
<alias_filename>,
<actual_filename>)
注解
include_alias
pragma 指令允许用具有不同名称或路径的文件替换源文件所包含的文件名。 例如,一些文件系统允许头文件名比 8.3 FAT 文件系统的限制更长。 因为较长的头文件名的前八个字符可能不是唯一的,因此编译器不能只是将较长的名称截断为 8.3。 每当编译器在 #include
指令中看到 alias_filename 字符串时,它就会用名称 actual_filename 来代替。 然后,它会加载 actual_filename 头文件。 此 pragma 必须在相应的 #include
指令之前出现。 例如:
// First eight characters of these two files not unique.
#pragma include_alias( "AppleSystemHeaderQuickdraw.h", "quickdra.h" )
#pragma include_alias( "AppleSystemHeaderFruit.h", "fruit.h" )
#pragma include_alias( "GraphicsMenu.h", "gramenu.h" )
#include "AppleSystemHeaderQuickdraw.h"
#include "AppleSystemHeaderFruit.h"
#include "GraphicsMenu.h"
要搜索的别名必须与规范完全一致。 大小写、拼写和双引号或尖括号的使用必须全部匹配。 include_alias
pragma 对文件名进行简单的字符串匹配。 不会执行其他文件名验证。 例如,给定下列指令,
#pragma include_alias("mymath.h", "math.h")
#include "./mymath.h"
#include "sys/mymath.h"
未完成别名替换,因为头文件字符串不完全匹配。 此外,不会替换用作 /Yu
和 /Yc
编译器选项自变量的头文件名或 hdrstop
pragma。 例如,如果源文件包含以下指令,
#include <AppleSystemHeaderStop.h>
则相应的编译器选项应为
/YcAppleSystemHeaderStop.h
可以使用 include_alias
pragma 将任何头文件名映射到另一个头文件名。 例如:
#pragma include_alias( "api.h", "c:\version1.0\api.h" )
#pragma include_alias( <stdio.h>, <newstdio.h> )
#include "api.h"
#include <stdio.h>
不要将用双引号引起来的文件名与用尖括号括起的文件名组合在一起。 例如,给定了上述两个 #pragma include_alias
指令后,编译器将不对下列 #include
指令执行任何替换:
#include <api.h>
#include "stdio.h"
而且,以下指令将生成错误:
#pragma include_alias(<header.h>, "header.h") // Error
错误消息中报告的文件名(或作为预定义的 __FILE__
宏的值的文件名)是文件在完成替换后的名称。 例如,请参阅以下指令后面的输出:
#pragma include_alias( "VERYLONGFILENAME.H", "myfile.h" )
#include "VERYLONGFILENAME.H"
VERYLONGFILENAME.H
中的错误会产生以下错误消息:
myfile.h(15) : error C2059 : syntax error
另请注意,不支持传递性。 给定以下指令,
#pragma include_alias( "one.h", "two.h" )
#pragma include_alias( "two.h", "three.h" )
#include "one.h"
编译器将搜索文件 two.h
而不是 three.h
。