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。