繁体   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