pragma 特性
#pragma midl_echo 指令指示 MIDL 将指定的字符串(不带引号字符)发出到生成的头文件中。
#pragma midl_echo("string")
#pragma token-sequence
#pragma pack (n)
#pragma pack ( [push] [, id] [, n} )
#pragma pack ( [pop] [, id] [, n} )
-
string
-
指定插入到生成的头文件中的字符串。 在插入过程中,将删除引号。
-
token-sequence
-
指定一系列标记,这些标记作为 #pragma 指令的一部分插入到生成的头文件中,而无需由 MIDL 编译器进行处理。
-
n
-
指定当前包大小。 有效值为 1、2、4、8 和 16。
-
id
-
指定用户标识符。
出现在 IDL 文件中的 C 语言预处理指令由 C 编译器的预处理器处理。 IDL 文件中的 #define 指令在 MIDL 编译期间可用,但不适用于 C 编译器。
例如,当预处理器遇到指令“#define WINDOWS 4”时,预处理器会将 IDL 文件中出现的所有“WINDOWS”替换为“4”。 符号“WINDOWS”在 C 编译时不可用。
若要允许 C 预处理器宏定义通过 MIDL 编译器传递到 C 编译器,请使用 #pragma midl_echo 或 cpp_quote 指令。 这些指令指示 MIDL 编译器生成包含参数字符串的头文件,并删除了引号。 #pragma midl_echo 和 cpp_quote 指令是等效的。
#pragma pack 指令由 MIDL 编译器用来控制结构的打包。 它替代 /Zp 命令行开关。 pack (n) 选项将当前包大小设置为特定值:1、2、4、8 或 16。 pack (push) 和 pack (pop) 选项具有以下特征:
- 编译器维护打包堆栈。 包装堆栈的元素包括包大小和可选 ID。堆栈仅受堆栈顶部的当前包大小的可用内存限制。
- 包 (推送) 会导致当前包大小推送到包装堆栈上。 堆栈受可用内存的限制。
- pack (push,n) 与 pack (push) 后跟 pack (n) 相同。
- 包 (推送, id) 还会将 ID 与包大小一起推送到包装堆栈上。
- Pack (push、 id、 n) 与 pack (push 相同, id) 后跟 pack (n) 。
- 打包 (弹出) 会导致弹出包装堆栈。 不均衡的弹出窗口会导致警告,并将当前包大小设置为命令行值。
- 如果指定了 pack (pop、 id、 n) ,则忽略 n 。
MIDL 编译器将 \cpp_quote 和 pragma 指令中指定的字符串放置在头文件中,这些字符串在 IDL 文件中指定的顺序以及相对于 IDL 文件中的其他接口组件。 所有 导入 操作后,字符串通常应出现在 IDL 文件的接口正文部分中。
MIDL 编译器不会尝试处理不以前缀“ midl_ ”开头的#pragma指令。IDL 文件中的其他 #pragma 指令将传递到生成的头文件中,而不会进行更改。
/* IDL file */
#pragma midl_echo("#define UNICODE")
cpp_quote("#define __DELAYED_PREPROCESSING__ 1")
#pragma hdrstop
#pragma check_pointer(on)
/* generated header file */
#define UNICODE
#define __DELAYED_PREPROCESSING__ 1
#pragma hdrstop
#pragma check_pointer(on)