长久以来,C++一直有一个问题那就是编译复杂。所以现在最新的C++20标准就新增了模块特性,试图改善这个状况。不过因为各大编译器以及工具链对新标准的支持还不够完善,所以目前我们只能简单尝鲜一下。想要正式在项目中应用这个特性,还需要很长的时间。
这里我用Visual Studio 2022来向大家介绍一下。首先在Visual Studio Installer中安装C++桌面开发的工作负载,同时在单个组件里找到对应的C++模块库文件(如下图所示)。

然后随便新建一个C++控制台程序,随便编译一下,这个时候我们还是使用默认的头文件形式来导入标准库。
#include <iostream>
int main()
{
std::cout << "Hello world!\n";
}
然后打开项目属性对话框,找到配置属性->C/C++->语言,将C++语言标准改为最新的,同时将启用实验性的C++标准库模块改为是。

这样一来我们就可以在项目中使用模块了。最简单的办法就是先试试标准库模块,将包含头文件的声明改为导入语句再编译试试。
import std.core;
int main()
{
std::cout << "Hello world!\n";
}
当然,我们也可以编写自己的模块。编写模块的时候,不能用常规的cpp
作为文件扩展名,而要使用ixx
作为扩展名,而且这时候我们的源代码也有了一个新名字,叫做模块接口文件。这里我新建一个hello.ixx
文件作为模块接口文件。
export module hello;
import std.core;
export void hello(std::string name)
{
std::cout << "Hello, " + name << std::endl;
}
然后,我们就可以在程序中导入自己的模块了。
import hello;
import std.core;
using namespace std;
int main()
{
hello("techstay");
cout << "你好,世界!" << endl;
}
可惜的是目前的工具链支持还不够完善,甚至连ReSharper都还没有支持模块特性,在运行上面的例子时候代码分析还提示了一些错误。希望一两年之内能够用上这个新特性吧。
网友评论