簡體   English   中英

子模塊:如何將C++模塊划分為子模塊

[英]Submodules: how to divide C++ module into submodules

我有一個帶有一個模塊的簡單項目。

單位.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;
}

主文件

import Units;

int main() {
    return foo();
}

編譯器向我顯示錯誤'Base':base class undefined。 這是預期的行為嗎? 如果是,如何將模塊划分為子模塊? 我想在我的 Units 模塊中派生,但在不同的文件中。

要將模塊拆分為多個文件,您需要使用分區。 為此,您需要首先創建一個主接口:

export module Units;

然后將組成模塊的每個單獨文件聲明為命名分區(導出模塊 <module_name>:<partition_name>),例如:

export module Units:Impl;

但是,這本身並不在文件之間共享類、變量或函數。 要從主界面或其他分區訪問分區,您需要添加導入語句 import:<partition_name> 例如:

import :Impl;

所以在上面的代碼中 Units_impl.ixx 對Base一無所知,因為它是在單獨的文件中聲明的,因此會出現錯誤。

這也意味着如果您想從分區訪問它,則不能在主接口中聲明 class 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;
}

主要.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 <module_or_partition_name> 從導入的模塊重新導出,例如:

export import :Impl;

這將使export void foo(); 在 Units.ixx 中是不必要的,它看起來像這樣:

export module Units;
export import :Impl;

模塊.ixx

export module mybar;

export import :Wheel;
export import :Bus;

輪子.ixx

export module mybar:Wheel;

export 
class Wheel{
};

總線.ixx

export module mybar:Bus;
import :Wheel;

export 
class Bus :public Wheel {
};

暫無
暫無

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

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