VS中新建.ixx文件需禁用预编译头、设为不使用,手动创建并确保export module为首条非注释语句,启用/experimental:module选项且import后必须加分号。

VS 里新建 .ixx 文件必须关掉预编译头
Visual Studio 默认项目会启用预编译头(stdafx.h 或 pch.h),但模块文件(如 .ixx)**不能包含任何 #include,且必须以 export module 开头**。一旦启用了预编译头,VS 会在每个源文件顶部自动插入 #include "pch.h",直接导致编译失败:error C7613: export module must be the first non-comment line。
解决方法很简单:
- 新建空项目(不是“控制台应用”模板,选“空项目”)
- 右键项目 → “属性” → “C/C++” → “预编译头” → 将“预编译头”设为
不使用预编译头 - 右键项目 → “添加” → “新建项” → 选择“C++ 文件(.cpp)”,手动把扩展名改成
.ixx(例如math.ixx),然后保存
export module 和 export 语句的位置不能错
export module 必须是文件中**第一条非注释语句**,前面不能有任何 #include、using、宏定义,甚至不能有空行(某些旧版 MSVC 对空行敏感)。否则报错:error C7613 或 error C2059: syntax error: 'export'。
正确写法示例(math.ixx):
立即学习“C++免费学习笔记(深入)”;
export module math;
<p>export int add(int a, int b) {
return a + b;
}</p><p>export namespace calc {
export double square(double x) { return x * x; }
}
注意:
-
export只修饰要对外暴露的符号(函数、变量、命名空间、类、枚举等) - 没加
export的函数(如内部 helper)仅在模块内可见,导入后不可用 - 模块内可以
import其他模块(包括标准库模块,如import std.core;),但不能#include
main.cpp 导入时 import 后不能跟分号
在 main.cpp 中导入模块,语法是 import math; —— 注意结尾**必须有分号**,这是 C++20 模块语法的硬性要求,不是可选的。漏掉分号会报:error C2143: syntax error: missing ';' before 'import'。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
同时,import 必须出现在全局作用域,不能在函数内部;也不能和 #include 混用(除非用全局模块片段,但那是过渡方案,不推荐)。
典型正确结构(main.cpp):
import math;
#include <iostream> // 仍可用 #include,但建议逐步迁移到标准库模块(如 import std.io;)
<p>int main() {
std::cout << add(2, 3) << '\n'; // OK:add 是 export 的
std::cout << calc::square(4.0) << '\n'; // OK:命名空间内 export 的函数
}
VS 编译器选项必须显式开启 /experimental:module
即使语言标准设为 C++20,MSVC 默认仍禁用模块支持。必须手动启用实验性模块功能,否则 export module 和 import 会被当作非法语法。
配置路径(VS 2022):
- 项目属性 → “C/C++” → “语言” → “C++ 语言标准” → 设为
ISO C++20 Standard (/std:c++20) - 同一页 → “启用实验性的 C++ 标准库模块” → 设为
是 (/experimental:module) - 项目属性 → “常规” → “扫描源以查找模块依赖关系” → 设为
是(让 VS 自动解析import依赖)
漏掉 /experimental:module 会导致所有模块语法报红,且错误信息非常模糊(比如只提示 unexpected token),容易误判为语法写错。
模块编译本质是两阶段:先编译 .ixx 生成二进制模块接口(.ifc 文件),再编译 main.cpp 时链接它。这个过程完全由编译器驱动,不经过预处理器 —— 这也是为什么你不能在 .ixx 里写 #define 或 #include。

















