【问题标题】:Submodules: how to divide C++ module into submodules子模块:如何将 C++ 模块划分为子模块
【发布时间】:2021-03-09 12:07:12
【问题描述】:

我有一个带有一个模块的简单项目。

单位.ixx

module;

#include <cassert>
export module Units;
export class Base {
public:
};
export void foo();

Units_impl.ixx

export module Units;

class Derived : public Base {  // 'Base': base class undefined
};

export void foo() {
    Derived derived;
}

Main.cpp

import Units;

int main() {
    return foo();
}

编译器向我显示错误“Base”:未定义基类。 这是预期的行为吗?如果是,如何将模块划分为子模块?我希望 Derived 在我的 Units 模块中,但在不同的文件中。

【问题讨论】:

  • 它可能与真正的问题无关,但你不能在不使用export module …;的文件中包含export:只需在foo的定义中省略它即可。
  • 谢谢。增加了出口。问题是一样的
  • 但是同一个模块不能有两个主接口单元!
  • 在这个例子中不清楚什么是公共接口和私有接口。

标签: c++ visual-studio module c++20


【解决方案1】:

要将模块拆分为多个文件,您需要使用分区。为此,您需要先创建一个主接口:

export module Units;

然后将组成模块的每个单独文件声明为命名分区(导出模块 :),例如:

export module Units:Impl;

这本身并不在文件之间共享类、变量或函数。要从主界面或其他分区访问分区,您需要添加导入语句 import : eg:

import :Impl;

所以在上面的代码中 Units_impl.ixx 对 Base 一无所知,因为它是在单独的文件中声明的,因此会出现错误。

这也意味着如果你想从一个分区访问它,你不能在主接口中声明类 Base,因为这会导致循环依赖。即,分区需要导入单元(主接口),而单元本身需要导入分区(单元:Impl)。所以至少你的文件需要看起来像:

单位.ixx:

export module Units;
import :Impl;

export void foo();

Units_Impl.ixx:

class Base{};
class Derived: public Base{};

export void foo()
{
    Derived derived;
}

Main.cpp:

import Units;

int main()
{
    foo();
    return 0;
}

如果您不希望 Base 与 Derived 位于同一文件中,则需要在单独的文件中创建另一个分区,例如:

Units_Base.ixx:

export Units:Base;
export class Base{};

然后您的 Units_Impl.ixx 将如下所示:

export Units:Impl;
import :Base;

class Derived: public Base{};

export void foo()
{
    Derived derived;
}

最后,您可以使用 export import 从导入的模块重新导出,例如:

export import :Impl;

这将使 Units.ixx 中的 export void foo(); 变得不必要,它看起来像这样:

export module Units;
export import :Impl;

【讨论】:

  • 可以有嵌套的模块分区吗?如Units:Impl:Impl1?
  • 不,不能。您必须使 Impl 或 Impl1 成为它们自己的模块并正常导入。
  • 规范让我有点不知所措,非常感谢您澄清这一点!
【解决方案2】:

模块.ixx

export module mybar;

export import :Wheel;
export import :Bus;

Wheel.ixx

export module mybar:Wheel;

export 
class Wheel{
};

巴士.ixx

export module mybar:Bus;
import :Wheel;

export 
class Bus :public Wheel {
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2016-10-31
    • 2023-03-14
    • 2012-01-25
    • 2018-08-31
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多