MSVC模块Win32编译报错:inline函数无法写入模块的原因及抑制方法
MSVC C++模块Win32配置编译报错问题
问题场景
测试MSVC与C++模块时,使用代码如下:
module; #include "windows.h" export module Module;
在Win32配置下编译时,触发以下报错:
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(1005,1): message : sorry: 'inline' function definition for 'ULONGLONG Int64ShllMod32(ULONGLONG,DWORD)' could not be written to module due to unrecognized expression or statement at 'C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(1010,5)'.
LONGLONG Int64ShraMod32(LONGLONG,DWORD)和ULONGLONG Int64ShrlMod32(ULONGLONG,DWORD)也出现相同报错,x64配置下无此问题。使用环境为Visual Studio 2022 17.5.0(v143),编译参数/std:c++20。
问题解答
1. 报错产生的原因
这是MSVC在Win32配置下处理C++模块的兼容性缺陷:
- Win32平台的
winnt.h中,这几个Int64*Mod32内联函数使用了针对32位环境的特殊汇编或编译器内部语法,而MSVC的C++模块编译流程无法正确解析这些语法,导致无法将函数定义写入模块单元。 - x64配置下,这些函数采用原生64位指令实现,无需特殊语法,因此不会触发该问题。
- 本质是VS2022 17.5版本的C++模块编译器对Win32平台Windows头文件的底层内联函数支持不完善。
2. 抑制报错的方法
可以通过以下几种方式处理:
- 调整头文件包含位置
避免在全局模块片段(module;之后)包含windows.h,改为将windows.h包含在模块实现内部,例如:
注意这种方式可能会增加模块接口的依赖复杂度,需根据实际需求选择。export module Module; #include "windows.h" - 禁用特定警告
该提示对应编译器警告码4656,可通过编译选项抑制:- 打开项目属性,导航至「C/C++」→「高级」→「禁用特定警告」
- 输入
4656并保存设置
- 升级Visual Studio版本
VS2022 17.6及后续版本对C++模块的兼容性做了修复,升级后该问题大概率会自动解决。
内容的提问来源于stack exchange,提问作者Dundo
相关产品推荐
相关产品推荐

