/kernel (Create Kernel Mode Binary)
创建在内核中执行的二进制文件。
/kernel[-]
实参
/kernel
在当前项目中的代码被编译,并且链接使用将 C++ 特定的代码的语言规则。在内核模式中运行。/kernel-
在当前项目中的代码被编译,并且链接,而无需使用特定的代码的 C++ 语言规则在内核模式中运行。
备注
没有等效 #pragma 控件此选项。
指定 /kernel 选项通知编译器和链接器仲裁哪些语言功能所允许的在内核模式,并确保所具有足够的功力避免使用内核模式 C++ 是唯一的运行时不稳定。这是通过禁止使用完成 C++ 是生成 scrum 在内核模式以及提供警告针对 C++ 语言功能是潜在破坏性的语言功能,但不能禁用。
/kernel 选项适用于生成的编译器和链接器阶段并在项目级别。通过 /kernel 开关指示编译器应加载生成的二进制文件,在链接后,向 windows 内核。编译器将缩小范围 C++ 语言功能给的内核将兼容的子集。
当 /kernel 指定时,下表列出了编译器行为的更改。
行为类型 |
/kernel 行为 |
---|---|
C++ 异常处理 |
禁用。throw 和 try 关键字的所有实例发出编译器错误 (不包括异常规范 throw())。/EH 选项与 /kernel兼容,但 /EH-。 |
RTTI |
禁用。除非静态,使用 dynamic_castdynamic_cast 和 typeid 关键字的所有实例发出编译器错误。 |
new 和 delete |
您必须显式定义 new() 或 delete() 运算符;编译器和运行时将不会提供一个默认值来定义。 |
当您使用 /kernel 选项时,自定义调用约定,/GS 生成选项和所有优化允许的。内联受 /kernel的不大影响,在同一语义保留由编译器。如果要确保,内联限定符的 __forceinline 起作用,必须确保,警告 C4714 启用,以便您知道特定 __forceinline 功能时不内联。
当编译器通过 /kernel 切换时,它将预定义名为 _KERNEL_MODE 并具有值 1的预处理器宏。可以使用此有条件地编译基于的代码执行环境是否在用户模式或内核模式。例如,下面的代码指定选件类应在不可用于分页的内存段,则为内核模式下执行时编译。
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
};
在使用与 /kernel时,某些目标结构和 /arch 选项的以下组合会产生错误:
/arch:{SSE|SSE2|AVX} 在 x86 不受支持。仅 /arch:IA32 支持与在 x86 的 /kernel。
/arch:AVX 不支持与 x64 的 /kernel。
与 /kernel 生成还通过 /kernel 传递给链接器。Her 将如何影响链接器行为:
增量链接已禁用。如果添加 /incremental 到命令行,链接器发出此错误:
LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'
链接器检查每个对象文件 (或所有可适用存档从静态库的成员) 若要查看它是否能编译了使用 /kernel 选项,但不是。如果任何实例满足此条件,如下表所示,成功仍链接器链接,但可能发出警告。
/kernel obj
/kernel- obj,MASM obj 或 cvtresed
/kernel 和 /kernel- objs 的组合
链接 /kernel
是
是
与警告 LNK4257
link
是
是
是
LNK4257 linking object not compiled with /KERNEL ; image may not run
/kernel 选项和 /driver 选项独立运行和这两个条件都不会影响其他操作。
在 Visual Studio 中设置 /kernel 编译器选项
打开项目的**“属性页”**对话框。有关更多信息,请参见如何:打开项目属性页。
选择 C/C++ 文件夹。
选择 命令行 属性页。
在 其他选项 框中,添加 /kernel 或 /kernel-。