Windows 10 WDK是否兼容C++17?切换标准后遇C5040警告求助
Windows 10 WDK与C++17兼容性问题解答
核心结论
Windows 10 WDK v10.0.19041.0不完全兼容C++17标准,切换到C17编译模式后出现的C5040警告,是因为WDK自带的CRT头文件中仍使用了C17已移除的语法特性。
警告原因分析
你遇到的警告C5040: dynamic exception specifications are valid only in C++14 and earlier; treating as noexcept(false),触发自WDK的setjmp.h文件中的这段代码:
#ifdef __cplusplus extern "C" { #if _MSC_VER >= 1200 #pragma warning(push) #pragma warning(disable:4987) /* nonstandard extension: throw (...) */ #endif _CRTIMP __declspec(noreturn) void __cdecl longjmp(_In_reads_(_JBLEN) jmp_buf _Buf, _In_ int _Value) throw(...); #if _MSC_VER >= 1200 #pragma warning(pop) #endif } #else _CRTIMP __declspec(noreturn) void __cdecl longjmp(_In_reads_(_JBLEN) jmp_buf _Buf, _In_ int _Value); #endif
其中的throw(...)属于动态异常规范,该特性在C11中被弃用,C17标准里已被完全移除。编译器在C++17模式下会识别这个过时语法,抛出C5040警告,并将其视为noexcept(false)处理。
临时解决办法
由于微软尚未修复该bug,你可以通过以下方式规避警告:
- 局部禁用警告:在包含触发警告的WDK头文件前后,临时禁用C5040警告,示例如下:
#pragma warning(push) #pragma warning(disable: 5040) #include <setjmp.h> #pragma warning(pop)
- 分模块设置标准:如果项目结构允许,可将依赖WDK的代码段单独设置为C14编译标准,其余代码使用C17,但这种方式需要额外的项目配置,复杂度较高。
现状说明
该问题早在2018年5月就已被用户提交给微软,但截至目前仍未得到官方修复。
内容的提问来源于stack exchange,提问作者Pavel Stepanek
相关产品推荐
相关产品推荐

