C++模块分区疑问:导入其他分区后其依赖是否可见?
C++模块分区依赖可见性问题解答
标准规范的要求
按照C++20及后续版本的模块规则,当一个模块分区导入另一个分区时,被导入分区的私有(非导出)导入不会自动传递给导入方。
在你的代码里,PartA使用的是import Foo;——这属于非导出导入,所以Foo中的名字不会被带入PartB的作用域。因此PartB里直接调用foo()是不符合标准的,应该编译失败。
VS2022编译通过的原因
VS2022的MSVC编译器可能在模块实现上做了宽松处理,或者早期版本的模块支持存在bug,没有严格遵循标准的可见性规则,导致本不该传递的导入被意外暴露了。但这不是标准规定的正确行为。
IntelliSense的提示才是正确的
IntelliSense的表现符合C++标准要求,它准确识别到PartB既没有直接导入Foo,也没有通过导出导入获得Foo的可见性,所以提示foo未定义是对的。
修正方案
要让PartB合法调用foo(),有两种可选方式:
- 直接在
PartB中添加import Foo; - 如果需要让
Foo在Bar的各分区间共享,把PartA的导入改成导出导入:// PartA.ixx export module Bar:PartA; export import Foo; // 用export import将Foo导出给所有导入PartA的分区/模块 export void partA() { foo(); }
内容的提问来源于stack exchange,提问作者Marwan
相关产品推荐
相关产品推荐

