LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 200|回复: 0

什么是 C++ 模块

[复制链接]
发表于 2024-2-18 23:02:04 | 显示全部楼层 |阅读模式
头文件是 C++ 中源文件之间共享声明和定义的方式。 头文件很脆弱,难以撰写。 它们的编译方式可能不同,这取决于你包含它们的顺序,或者取决于是否有定义的宏。 它们可能会减缓编译进度,因为它们要对包含它们的每个源文件进行重新处理。

C++20 引入了用于组件化 C++ 程序的一种新式方法:模块。

与头文件一样,模块允许跨源文件共享声明和定义。 但与头文件不同的是,模块不会泄露宏定义或专用实现详细信息。

模块更易于撰写,因为它们的语义不会因为宏定义或其他已导入的内容、导入顺序等而改变。 它们还可以更轻松地控制使用者可见的内容。

模块提供了头文件所不具备的额外安全保证。 编译器和链接器协同工作,以防止可能出现的名称冲突问题,并提供更强大的单一定义规则 (ODR) 保证。

强所有权模型可避免在链接时名称之间发生冲突,因为链接器会将导出的名称附加到导出它们的模块。 这种模式使 Microsoft Visual C++ 编译器能够阻止通过链接报告同一程序中类似名称的不同模块而导致的未定义行为。 有关详细信息,请参阅强所有权。

模块由编译为二进制文件的一个或多个源代码文件组成。 二进制文件描述了模块中的所有导出类型、函数和模板。 当源文件导入模块时,编译器会读入包含模块内容的二进制文件。 读取二进制文件比处理头文件快得多。 此外,每次导入模块时,编译器都会重复使用二进制文件,从而节省更多时间。 由于一个模块只生成一次,而不是每次导入时都会生成,因此生成时间可以减少,有时会大幅减少。

更重要的是,模块没有头文件存在的脆弱问题。 导入模块不会更改模块的语义,也不会更改任何其他导入的模块的语义。 在模块中声明的宏、预处理器指令和非导出名称对导入它的源文件是不可见的。 可以按任意顺序导入模块,并且不会更改模块的含义。

模块可以与头文件并行使用。 如果要迁移代码库以使用模块,此功能十分方便,因为可以分阶段执行此操作。

在某些情况下,可以将头文件作为标头单元,而不是 #include 文件导入。 标头单元是预编译头文件 (PCH) 的推荐替代方法。 与共享 PCH 文件相比,它们更易于设置和使用,但它们提供类似的性能优势。 有关详细信息,请参阅演练:在 Microsoft Visual C++ 中生成和导入标头单元。

代码可以使用同一项目中的模块或任何引用的项目,自动使用对静态库项目的项目到项目引用。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表