![](/img/trans.png)
[英]C++ with git and CMake: How to build submodules with specific parameters?
[英]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.