簡體   English   中英

C++ 模塊的兩步編譯?

[英]Two-Step Compile for C++ Modules?

Clang 和 GCC(也許還有 MSVC?)目前正在使用兩步編譯來實現他們的模塊:

  • 生成 BMI/CMI(MSVC 的 IPR,如果它仍然這樣做?)以供其他人的導入使用。
  • 生成 object 文件以饋送到 linker。

生成 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM