【发布时间】:2021-01-14 05:10:25
【问题描述】:
传统上,C++ 库由头文件 + 在二进制文件中编译的实现组成(.a、.so、.dylib、.dll,...)。源代码中的头文件为#included,二进制部分链接到最终的可执行文件。
C++20 中的模块会改变这种布局吗?如果是这样,操作系统是否必须升级它们分发其核心库的方式,例如Linux 中的标准库或 Windows 中的其他核心 dll?
【问题讨论】:
-
好吧,我还没有研究过最新的草案规范,但始终需要做的一件事是向后兼容性。现有软件的堆积如山能够被编译,即使一种语言引入了“更好的方法”。
.h文件策略是原始的,但它永远不会消失。 -
IIUC 模块的设计使编译器能够在编译时生成一种“模块定义文件”。这对我来说似乎很让人联想到预编译的头文件。所以我认为这种二元性不会发生任何变化。只有编译器开关可能会改变。
-
从 C++ 20 开始,规范中没有标准库模块,这是 C++23 target:
Now that Modules are in C++20, C++23 should ship with a specification of how the functionality of the standard library is exposed as modules. -
模块几乎只是纯编译的头文件,所以几乎只是对现有头文件的直接交换,我认为其他任何事情都不会改变
-
二进制文件应该仍然存在,但确实,提供头文件和/或模块定义文件可能会有所不同(并且由于模块定义格式尚未标准化,头文件似乎更便携)
标签: c++ c++20 c++-modules