Visual Studio使用C++模块出现重定义错误是否为Bug?
关于Visual Studio 17.7.6中C++模块与标准库头文件冲突的问题解答
问题场景
模块文件MyModule代码如下:
export module MyModule; #include <iostream>
非模块文件main.cpp代码如下:
import MyModule; #include <vector> int main(void) { return 0; }
无论在Debug还是Release模式下编译,都会触发以下错误:
Error C2365 '__ISA_AVAILABLE_X86': redefinition; previous definition was 'enumerator'
Error C2365 'std::denorm_indeterminate': redefinition; previous definition was 'enumerator'
注释任意一个#include语句即可正常编译,使用的Visual Studio版本为17.7.6。
结论与解决方案
这是Visual Studio 17.7.x版本中的已知Bug,问题根源在于C++模块系统与标准库头文件的符号隔离逻辑缺陷:模块中引入的<iostream>和主文件中引入的<vector>会间接引入重复的系统级枚举定义,编译器未正确处理模块环境与传统头文件环境下的符号重复问题。
解决办法
- 升级Visual Studio版本:该Bug在17.8及以上版本中已被官方修复,升级后即可正常编译。
- 临时规避方案:
- 注释其中一个冲突的
#include语句; - 将主文件中的
<vector>改为模块导入方式(需开启C++20模块支持):import MyModule; import std.vector; int main(void) { return 0; }
- 注释其中一个冲突的
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

