You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:15:34