保存预处理器输出

查看预处理器输出可能是一种有效的故障排除方法;例如,当出现无效的 IDL、C 或 C 预处理器语法时,或是 MIDL 命令行中的虚假 -D 值导致 MIDL 报告不可预测的错误时。 开发人员可能还希望检查预处理器输出以确定编译器输入流中存在哪些文件和定义;例如,必须解决类型重定义冲突这一困难情况。 或是以下不太常见的情况:某些开发人员可能希望使用 /cpp_opt 强制开启预处理器的专用开关,或是可能想了解这些开关的工作原理。

从 MIDL 编译运行中获取预处理文件的最简便且最不突兀的方法是使用 -savePP 开关。 -savePP 开关只会阻止 MIDL 删除预处理器传回到 MIDL 的临时文件。 考虑以下情况:

midl -savePP -Id:\nt\public\sdk\inc -DNTENV=1 -Oicf -env win32 stub.idl

此指令会编译 Stub.idl,但保留所有预处理器文件。

注意

MIDL 会为 IDL 和 ACF 文件(如果存在)以及每个导入的文件生成单独的预处理器运行。

 

对于 DCOM 编译,通常会生成多个预处理器文件,即使 MIDL 会将其作为虚拟连续输入流来处理。 在典型的 Windows 编程环境中,这些临时文件可在 Temp 目录中找到,而其文件名则如 MID*.tmp。 如果保留预处理器输出,则最好监视 Temp 目录中的最新文件,以确定哪些文件与哪个预处理器运行相关联。

简单情况下(例如,编译的 IDL 文件不会直接或间接导入其他文件,或在检查顶级文件时),可直接调用预处理器。 直接执行 C/C++ 预处理器可能会出现经 MIDL 屏蔽或混淆的错误。 例如,以下两个预处理器命令行可用于先前引用的 MIDL 行:

cl /E /nologo -Id:\nt\public\sdk\inc -DNTENV=1 stub.idl > stub.pp

cl /E /P -Id:\nt\public\sdk\inc -DNTENV=1 stub.idl

在这两个示例的第一个示例中,/E /nologo 为 MIDL 在调用预处理器时所添加的开关。 预处理器输出会发送到 stdout(屏幕),因此需重定向到文件以便进行检查。 在这些示例中的第二个示例中,/P 指示预处理器将输出重定向到 *.i 文件。在此情况下,会在当前目录中创建 Stub.i 文件。

/cpp_opt 开关还可用于获取预处理文件,但对比先前提及的方法则较难使用且效果不佳。 以下示例还会生成 Stub.i 文件,如前一示例所示。 以下示例中的引号必须存在:

Midl -Oicf -win32 -cpp_opt "/E /P -Id:\nt\public\sdk\inc -DNTENV=1" stub.idl