MIDL 的 C 预处理器要求

此页面仅适用于有特定原因将 Microsoft C/C++ 预处理器替换为 MIDL 使用的预处理器的开发人员,或必须指定自定义预处理器开关的开发人员。 MIDL 开关 /cpp_cmd/cpp_opt/no_cpp 用于替代编译器的默认行为。 通常没有理由替换 Microsoft C/C++ 预处理器,也没有理由指定自定义的预处理器开关。

在 IDL 文件的初始处理过程中,MIDL 编译器使用 C 预处理器。 编译 IDL 文件时使用的生成环境与默认的 C/C++ 预处理器相关联。 如果要使用不同的预处理器,则 MIDL 编译器开关 /cpp_cmd 启用默认 C/C++预处理器名称的替代:

midl /cpp_cmd preprocessor_name filename

preprocessor_name

指定要由 MIDL 使用的预处理器的名称。 可以使用二进制文件的路径指定。 .exe扩展是可选的。

filename

指定 IDL 文件的名称。

  • MIDL 编译器要求任何预处理器遵守以下约定:
  • 输入文件指定为命令行上的最后一个参数。
  • 预处理器必须将输出重定向到标准输出设备 stdout。
  • 在预处理器的输出流中, 存在 #line 指令以实现更好的诊断消息。
  • 行指令是输出流中唯一的预处理器指令。

MIDL 假定生成的预处理器已从编译器的输入流中删除所有预处理器指令,但确定编译器消息中源位置所需的行指令除外。 指示与 Microsoft C/C++ 预处理器不同的预处理器时,或使用 /cpp_opt 开关指定预处理器选项时,需要指定适当的预处理器选项,以便将行指令放入编译器的输入流中。 例如,对于 Microsoft C/C++ 预处理器,必须使用 /E 选项:

midl /cpp_cmd cl.exe /cpp_opt "/E" file.idl

MIDL 采用以下形式之一接受 #line 指令:

#line digit-sequence "filename" new-line
 
# digit-sequence "filename" new-line

有关行指令和其他预处理器指令的完整说明,请参阅所用 C 编译器的文档。

MIDL 仅接受行预处理器指令。 因此,如果使用 /no_cpp 开关,则输入文件不得具有其他预处理器指令,或者必须在调用 MIDL 之前处理输入文件。

有关详细信息,请参阅 处理 IDL 文件中的#defines