簡體   English   中英

如果 C++ 模塊分區 B 導入模塊分區 A,分區 A 導入的任何內容在分區 B 中是否也可見?

[英]If a C++ module partition B imports module partition A, is anything imported by partition A also visible in partition B?

在一個有分區的模塊中,我注意到如果一個分區導入另一個分區,則第二個分區導入的所有內容在第一個分區中也可見。 這是正確的行為還是編譯器中的錯誤?

我正在使用 VS2022。

假設我們有一些模塊 Foo:

// Foo.ixx

export module Foo;

export void foo()
{
};

我們還有另一個帶有兩個分區的模塊 Bar:

// Bar.ixx

export module Bar;

export import :PartA;
export import :PartB;

第一個分區導入模塊 Foo:

// PartA.ixx

export module Bar:PartA;
import Foo;

export void partA()
{
    foo(); 
}

第二個分區導入第一個分區:

// Part B.ixx

export module Bar:PartB;
import :PartA;

export void partB()
{
    partA();
    foo();  // should this compile?
}

分區 partB 從模塊 Foo 調用 function foo()。 partB 沒有導入 Foo,但是 partA 導入了。 在 VS2022 中,項目編譯正常,但 Intellisense 抱怨“foo”未定義。 哪一個是正確的?

[basic.scope.namespace]/2說明一個 TU 中使用的名稱是否在導入它的 TU 的 scope 中。 簡短版本是如果Bar:Part2導入Foofoo可見。

所以……是嗎?

是的。

當模塊分區單元導入另一個分區(必須是同一個模塊,因為你不能導入其他人的分區)時,它也會隱式導入該分區importexport TU

此外,當某個模塊M的模塊單元中的模塊導入聲明導入M的另一個模塊單元U時,它還會導入由U的模塊單元范圍內的非導出模塊導入聲明導入的所有翻譯單元。

所以Bar:Part2間接導入Foo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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