Need is all you need:AI接手Coding后,程序员最值钱的能力只剩这一项?
2026/5/16 17:20:56
现代C++提出了一个非常breakthrough的特性,就是模块,尽管有一些时间的发展了(这个玩意是C++20出的),目前在一些demo case中,VS对模块的支持还OK。笔者也计划试一试逐步开始尝试向自己的一些玩具项目引入module来化简自己工程的依赖处理关系。
C++ 模块(C++20)是为了替代传统头文件的一种编译单位机制,在之前,我们如果一个源文件发生更改,这个源文件都需要被全部重新编译,但是模块的增量编译分析到了二进制ABI层次,MSVC的模块(是的,跟其他编译器的厂商实际上不太互通)通过模块二进制接口/BMI 缓存编译产物,而且,这一次的导出更加的健壮,之后我们会介绍两个关键字来告诉你模块的导入和导出是如何工作的。
现在VS2022开始下不到了(至少不太好搞到),这就是为什么笔者采用VS2026了。要在 VS2026 上顺利使用模块,请确认以下项目:
/std:c++20或更保守地/std:c++latest(VS2026 的 MSVC 提供对模块的更完整支持)。不过别担心,VS2026默认就是上面的选项,不用改,你怕的话就看一眼就好了创建一个小工程vs2026-modules-demo/,包含两个文件:
math.ixx(模块接口单元):
exportmodule math;exportintadd(inta,intb){returna+b;}exportstructPoint{intx,y;};main.cpp(使用模块):
import std;import math;intmain(){std::print("Add Result: {}",add(1,2));Point p{1,2};std::print("Point p ({}, {})\n",p.x,p.y);return0;}说明:MSVC 社区中
.ixx是常见的模块接口扩展名;你也可以使用.cppm等,但 IDE/工具链对扩展名的默认识别可能不同。
Visual Studio 已把大部分模块构建细节交给 MSBuild/IDE 去管理,你通常只需把文件加入项目:
Console App (C++)(选择 Desktop development with C++ workload)。math.ixx与main.cpp。C++ Language Standard选择ISO C++20或者是以上( 选择Preview也是可以的),同时,还要再 Properties → C/C++ → Language中开启将生成C++23的标准库模块选择为是.obj。如果模块间依赖复杂(跨项目),可以使用项目引用或在 Project Properties 中配置 Module References。