gpt4 book ai didi

c++-modules - C++ 模块在哪些文件中,它与模板的关系如何?

转载 作者:行者123 更新时间:2023-12-02 02:42:27 25 4
gpt4 key购买 nike

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

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

因此,对于一个非常简单的情况:它看起来是否类似于 header 声明、源代码实现,像这样?

// 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
}

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

最佳答案

文件名约定(针对四种不同类型的模块单元!)仍在形成;各种原型(prototype)实现可能会开发自己的竞争(一段时间?)。使用与 头文件 文件相同的样式肯定是个坏主意,因为所有三个

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

尽管它们的含义非常不同,但这似乎是合理的。

(同样,不要将 .h 用于 C++ 头文件,以便将它们与 C 头文件区分开来。)不可导入的模块单元(那些具有简单的 module a; 既不是分区也不是接口(interface)单元的模块)可能会很好地坚持使用 .cpp/ .cc/etc .,因为它们不需要(典型的) 构建 系统的任何特别注意。

您的 Foo 示例是合理的,但请注意(使用意味着支持此用例的实现)您可以 在接口(interface)中定义 Foo ,然后更改该定义而不会冒 ABI 中断的风险。 (但是,这样的更改会导致基于修改时间的构建系统重新编译客户端,而对这些实现没有任何好处。)但是,如果您将 Foo 内联为 (此处是可选的,但如果它是必需的)在基于头文件的库的“接口(interface)”中定义),对其定义的更改对所有典型实现都有 ABI 影响。

模板仍然受到熟悉的限制:必须导入它们的定义——在模块 接口(interface) (主或分区)中可用以供外部使用——供客户端创建实例化,显式特化和实例化通常异常(exception)。实现单元预计将分别编译 并且可能以二进制形式发布,由于与普通源文件相同的原因,它们无法提供模板定义。

关于c++-modules - C++ 模块在哪些文件中,它与模板的关系如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com