[英]Two-Step Compile for C++ Modules?
Clang 和 GCC(也许还有 MSVC?)目前正在使用两步编译来实现他们的模块:
生成 BMI/CMI 但不生成 object 文件的模块似乎有一些可能的用途,例如仅导出用于条件编译的类型或 constexpr 变量的模块。
据我从标准中可以理解,没有什么说我必须生成/链接对象文件。 所以我想知道我是否错过了关于使用这样的模块的一些明显的东西,如果我们希望工具支持这种“作为模块构建,而不是作为对象构建”的工作流程?
我希望模块能够为通常不会包含标题的内容提供定义。
想象一下这个模块:
export module hello;
export inline auto say_hello() -> char const* {
return "hello world";
}
如您所见,function 是内联的。 它也在界面中。 现在有了 header,没有地方放实现了。 为了使内联 function 成为可能,该语言允许找到多个定义。 所以每个TU output自己在object文件中定义。
这是使用模块可以避免的重复工作。 如您所见,模块接口就像任何其他 cpp 文件一样是 TU。 当您导出内联 function 时,是的,该实现可用于其他 TU,但并非所有tu 都必须提供实现,因为它可以放在一个地方:具有内联 function 的 TU。
我期望与 constexpr 变量相同。 它们也需要定义,因为您可以为它们提供参考或地址。 以此为例:
export module foo;
import <tuple>;
export constexpr auto tup = std::tuple{1, 'a', 5.6f};
import foo;
int a = std::get<0>(tup);
std::get
function 引用元组。 即使它是一个 constexpr 变量,某些上下文(尤其是没有优化的情况)可能需要使用 ODR 变量。
因此,在我的示例中,即使模块foo
仅导出 constexpr 变量,我希望 cpp 文件编译为包含定义的 object 文件。
object 文件中也可能没有任何内容。 我也希望它今天表现得像一个空的 TU:
// I'm empty
您可以毫无问题地将此类cpp
文件添加到项目中,并将其链接到您的可执行文件。 我希望这些工具与模块的行为相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.