C ++模块进入哪些文件,模板如何运行?

萨姆·范甜甜圈

据我了解,模块接口及其实现可以分为两个不同的文件。与header.h和source.cpp文件相似。

这些文件的名称和后缀是什么?我们在界面上是否坚持使用“ .h”?

因此,对于一个非常简单的情况:看起来像头声明,源实现一样吗?

// Module Interface: file name: mymodule.h ?
export module my.module;
export void Foo();

// Module implementation: file name mymodule.cpp ?
module my.module;
void Foo() {
   // complex code
}

如果我们编写模板代码,它的行为如何?它仍然只是“标题”(即模块接口),还是我们现在可以将其移至实现文件?

戴维斯鲱鱼

文件名约定(用于四种不同类型的模块单元!)仍在形成;各种原型实现很可能会开发自己的竞争产品(一段时间?)。使用与文件相同的样式当然不是一个好主意,因为这三个

#include"a.hh"  // header file
import "a.hh";  // header unit
import a;       // named module

尽管它们的含义截然不同,但还是很合理的。

(类似地,不使用.h用于C ++头,从而将它们从C头区分开。)非导入的模块单元(那些具有一个简单的module a;既不是分区和接口单元)很可能会与粘.cpp/ .cc/,因为它们不需要来自(典型)构建系统的任何特殊注意

您的Foo示例是合理的,但请注意(使用旨在支持该用例的实现),您可以在界面中进行定义 Foo,然后在不冒险中断ABI的情况下更改该定义(但是,这种更改将导致基于修改时的构建系统重新编译客户端,而对那些实现没有任何好处。)但是,如果您进行内联(在此是可选的,但如果在基于头文件的库的“接口”),对其定义的更改在所有典型实现中都具有ABI含义。Foo

模板仍然受到熟悉的限制:模板的定义必须导入(可在模块接口(主要或分区)中供外部使用),以供客户端创建实例化,而显式专业化和实例化通常是例外。预计实施单位进行编译分开,也许运二进制形式,从基于同样的理由,作为普通源文件提供模板定义不合格它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章