MIDL 的 C 预处理器要求

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

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

midl /cpp_cmd preprocessor_name filename

preprocessor_name

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

文件名

指定 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。