C++ 模块放在哪些文件中,它与模板的关系如何?
In which files do C++ modules go and how is it with templates?
据我了解,模块 接口s 及其实现可以分为两个不同的文件。与 header.h 和 source.cpp 文件类似。
这些文件的约定名称是什么,文件后缀是什么?我们是否坚持使用“.h”作为界面?
所以对于一个非常简单的情况:它看起来会像 header-declaration、source-implementation 那样吗?
// 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
}
如果我们编写模板代码,它会如何表现?它仍然只是"header"(即模块接口),还是我们现在可以将它移动到实现文件中?
文件名约定(针对四种不同类型的模块单元!)仍在形成中;各种原型实现可能会开发自己的竞争(一段时间?)。使用与 header 文件相同的样式当然不是一个好主意,因为
所有三个
#include"a.hh" // header file
import "a.hh"; // header unit
import a; // named module
尽管含义截然不同,但看起来很合理。
(同样,不要对 C++ 头文件使用 .h
,以区别于 C 头文件。)不可导入的模块单元(那些带有简单module a;
既不是分区也不是接口单元)可能会很好地坚持使用 .cpp
/.cc
/ 等 ,因为它们不需要任何来自(典型)build 系统的特别关注。
您的 Foo
示例是合理的,但请注意(使用旨在支持此用例的实现)您可以 define Foo
在界面中之后 更改 该定义而不冒 ABI 中断的风险。 (但是,这样的更改会导致基于修改时间的构建系统重新编译客户端,对这些实现没有任何好处。)但是,如果您使 Foo
inline(这里是可选的,但如果它是在基于头文件的库的“接口”中定义的,则它是必需的),对其定义的更改对所有典型实现都有 ABI 影响。
模板仍然受到熟悉的限制:它们的定义必须被导入——在模块接口(主要或分区)中可用以供外部使用——供客户create 实例化,显式特化和实例化通常除外。预计实现单元将 单独编译 并且可能以二进制形式发布,由于与普通源文件相同的原因,它们无法提供模板定义。
据我了解,模块 接口s 及其实现可以分为两个不同的文件。与 header.h 和 source.cpp 文件类似。
这些文件的约定名称是什么,文件后缀是什么?我们是否坚持使用“.h”作为界面?
所以对于一个非常简单的情况:它看起来会像 header-declaration、source-implementation 那样吗?
// 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
}
如果我们编写模板代码,它会如何表现?它仍然只是"header"(即模块接口),还是我们现在可以将它移动到实现文件中?
文件名约定(针对四种不同类型的模块单元!)仍在形成中;各种原型实现可能会开发自己的竞争(一段时间?)。使用与 header 文件相同的样式当然不是一个好主意,因为
所有三个#include"a.hh" // header file
import "a.hh"; // header unit
import a; // named module
尽管含义截然不同,但看起来很合理。
(同样,不要对 C++ 头文件使用 .h
,以区别于 C 头文件。)不可导入的模块单元(那些带有简单module a;
既不是分区也不是接口单元)可能会很好地坚持使用 .cpp
/.cc
/ 等 ,因为它们不需要任何来自(典型)build 系统的特别关注。
您的 Foo
示例是合理的,但请注意(使用旨在支持此用例的实现)您可以 define Foo
在界面中之后 更改 该定义而不冒 ABI 中断的风险。 (但是,这样的更改会导致基于修改时间的构建系统重新编译客户端,对这些实现没有任何好处。)但是,如果您使 Foo
inline(这里是可选的,但如果它是在基于头文件的库的“接口”中定义的,则它是必需的),对其定义的更改对所有典型实现都有 ABI 影响。
模板仍然受到熟悉的限制:它们的定义必须被导入——在模块接口(主要或分区)中可用以供外部使用——供客户create 实例化,显式特化和实例化通常除外。预计实现单元将 单独编译 并且可能以二进制形式发布,由于与普通源文件相同的原因,它们无法提供模板定义。