我们在C++20中有模块,我们可以完全删除代码中的#include
吗?
例如,我们可以编写
import boost.asio;
...
代替
#include <boost/asio.hpp>
...
在过去,我们需要以下步骤来安装库:
- 将所有源(.cpp(编译为对象(.o(
- 将它们打包到库(.a或.so(中
- 将收割台安装到
/usr/include
中 - 将库文件安装到
/usr/lib
中
在C++20中,我们可以:
- 编译所有源文件,但每个源文件可能会生成一个对象(.o(和一个编译模块接口(CMI(。对于gcc,它们有.gcm后缀
- 将对象(.o(打包到库(.a或.so(中
- 将库文件安装到
/usr/lib
中 - 将CMI安装到某个路径中
但是使用CMI发布库会导致问题:
- 我们没有一个特殊的文件夹来放置CMI(我想可能是
/usr/include/c++-modules
( - 不同的编译器产生不同的CMI。对于开发人员来说,为他们的库提供不同版本的CMI是非常糟糕的
- 如果我们根据模块B编译模块A,但使用不同的编译标志,该怎么办?不同的标志可能不会引起你的注意,但可能会导致潜在的错误
用CMI替换标头不是一个好方法。那么,我们如何才能从C++中完全删除头呢?
我不是在谈论标准库,因为模块化c++标准库是在c++23中引入的。
模块不意味着是二进制分发机制;您应该期望提供模块接口文件(,即,编译为库中对象文件的相同文件,不是头文件(,并将CMI生成和缓存(分别(留给客户端的编译器和构建树。因此,只有在使用给定模块的第一翻译单元之后,每个客户端才能实现构建速度优势。
其他共享机制很可能会在实践中出现,但重要的是,它本质上并不比现有的构建策略更复杂或更不兼容。