日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++module編程升級指南,子模塊與分區(qū)全解析

子模塊

1.C++ 標準與子模塊

C++ 標準并沒有特別提到子模塊,但允許在模塊名稱中使用點(.),從而可以按任何你想要的層次結(jié)構(gòu)來組織模塊。例如,以下是一個 DataModel 命名空間的示例:

創(chuàng)新互聯(lián)公司專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、德興網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站制作、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為德興等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

export module datamodel;
import ;

export namespace DataModel {
    class Person { /* ... */ };
    class Address { /* ... */ };
    using Persons = std::vector;
}

Person 和 Address 類都在 DataModel 命名空間內(nèi),也在 datamodel 模塊中??梢酝ㄟ^定義兩個子模塊來重構(gòu):datamodel.person 和 datamodel.address。

2.子模塊的模塊接口文件

datamodel.person 子模塊的模塊接口文件如下:

export module datamodel.person; // datamodel.person 子模塊
export namespace DataModel {
    class Person { /* ... */ };
}

datamodel.address 子模塊的模塊接口文件如下:

export module datamodel.address; // datamodel.address 子模塊
export namespace DataModel {
    class Address { /* ... */ };
}

最后,定義一個 datamodel 模塊如下。它導入并立即導出兩個子模塊。

export module datamodel; // datamodel 模塊
export import datamodel.person; // 導入并導出 person 子模塊
export import datamodel.address; // 導入并導出 address 子模塊
import ;
export namespace DataModel {
    using Persons = std::vector;
}

當然,子模塊中類的方法實現(xiàn)也可以放在模塊實現(xiàn)文件中。例如,假設(shè) Address 類有一個默認構(gòu)造函數(shù),僅打印一條語句到標準輸出;該實現(xiàn)可以放在一個名為 datamodel.address.cpp 的文件中:

module datamodel.address; // datamodel.address 子模塊
import ;
using namespace std;

DataModel::Address::Address() {
    cout << "Address::Address()" << endl;
}

3.使用子模塊的好處

用子模塊結(jié)構(gòu)化代碼的好處是,客戶端可以導入他們想要使用的特定部分,或者一次性導入所有內(nèi)容。例如,如果客戶端僅對使用 Address 類感興趣,以下導入聲明就足夠了:

import datamodel.address;

另一方面,如果客戶端代碼需要訪問 datamodel 模塊中的所有內(nèi)容,那么以下導入聲明是最簡單的:

import datamodel;

模塊分區(qū)

1.分區(qū)與子模塊的區(qū)別

分區(qū)和子模塊之間的區(qū)別在于,子模塊結(jié)構(gòu)對模塊的使用者是可見的,允許用戶選擇性地只導入他們想使用的子模塊。另一方面,分區(qū)用于內(nèi)部結(jié)構(gòu)化模塊,對模塊的使用者不可見。在模塊接口分區(qū)文件中聲明的所有分區(qū)最終必須由主要的模塊接口文件導出。一個模塊始終只有一個這樣的主模塊接口文件,即包含 export module 名稱聲明的接口文件。

2.創(chuàng)建模塊分區(qū)

模塊分區(qū)是通過將模塊名稱和分區(qū)名稱用冒號分隔來創(chuàng)建的。分區(qū)名稱可以是任何合法的標識符。例如,前一節(jié)中的 DataModel 模塊可以使用分區(qū)而不是子模塊來重構(gòu)。以下是 datamodel.person.cppm 模塊接口分區(qū)文件中的 person 分區(qū):

export module datamodel:person; // datamodel:person 分區(qū)
export namespace DataModel {
    class Person { /* ... */ };
}

3.分區(qū)的實現(xiàn)文件注意事項

使用分區(qū)時的一個注意事項是:與分區(qū)相結(jié)合的實現(xiàn)文件只能有一個文件具有特定的分區(qū)名稱。因此,以下聲明開始的實現(xiàn)文件是不正確的:

module datamodel:address;

相反,你可以將 address 分區(qū)的實現(xiàn)放在 datamodel 模塊的實現(xiàn)文件中:

module datamodel; // 不是 datamodel:address!
import ;
using namespace std;

DataModel::Address::Address() {
    cout << "Address::Address()" << endl;
}

警告:多個文件不能有相同的分區(qū)名稱。因此,擁有多個具有相同分區(qū)名稱的模塊接口分區(qū)文件是非法的,且分區(qū)文件中聲明的實現(xiàn)不能放在具有相同分區(qū)名稱的實現(xiàn)文件中。相反,應(yīng)該將這些實現(xiàn)放在模塊的實現(xiàn)文件中。

4.編寫分區(qū)模塊的要點

編寫分區(qū)結(jié)構(gòu)的模塊時,要記住的重要一點是,每個模塊接口分區(qū)最終必須由主模塊接口文件直接或間接導出。要導入分區(qū),只需指定分區(qū)名稱,前綴為冒號,例如 import :person。說 import datamodel:person 是非法的。請記住,分區(qū)對模塊的使用者不可見;分區(qū)只在模塊內(nèi)部結(jié)構(gòu)化。因此,用戶不能導入特定的分區(qū);他們必須導入整個模塊。分區(qū)只能在模塊內(nèi)部導入,因此在冒號前指定模塊名稱是多余的(且非法的)。

以下是 datamodel 模塊的主模塊接口文件:

export module datamodel; // datamodel 模塊(主模塊接口文件)
export import :person;   // 導入并導出 person 分區(qū)
export import :address;  // 導入并導出 address 分區(qū)
import ;
export namespace DataModel {
    using Persons = std::vector;
}

5.使用分區(qū)結(jié)構(gòu)化的 datamodel 模塊

import datamodel;

int main() {
    DataModel::Address a;
}

注意:分區(qū)用于內(nèi)部結(jié)構(gòu)化模塊。分區(qū)在模塊外部不可見。因此,模塊的用戶不能導入特定分區(qū);他們必須導入整個模塊。早先提到,模塊名稱聲明隱含地包含一個導入名稱聲明。但對于分區(qū),情況并非如此。例如,datamodel:person 分區(qū)沒有隱含的 import datamodel 聲明。在這個例子中,甚至不允許在 datamodel:person 接口分區(qū)文件中添加顯式的 import datamodel 聲明。這樣做會導致循環(huán)依賴:datamodel 接口文件包含 import :person 聲明,而 datamodel:person 接口分區(qū)文件會包含 import datamodel 聲明。

實現(xiàn)分區(qū)

1.定義和用途

實現(xiàn)分區(qū)不需要在模塊接口分區(qū)文件中聲明,它也可以在模塊實現(xiàn)分區(qū)文件中聲明,這是一個帶有 .cpp 擴展名的普通源代碼文件,在這種情況下,它是一個實現(xiàn)分區(qū),有時也稱為內(nèi)部分區(qū)。這種分區(qū)不會被主模塊接口文件導出。例如,假設(shè)你有以下數(shù)學主模塊接口文件(math.cppm):

export module math; // math 模塊聲明
export namespace Math {
    double superLog(double z, double b);
    double lerchZeta(double lambda, double alpha, double s);
}

假設(shè)進一步數(shù)學函數(shù)的實現(xiàn)需要一些不能被模塊導出的輔助函數(shù)。實現(xiàn)分區(qū)是放置這些輔助函數(shù)的完美位置。以下在名為 math_helpers.cpp 的文件中定義了這樣的實現(xiàn)分區(qū):

module math:details; // math:details 實現(xiàn)分區(qū)
double someHelperFunction(double a) {
    return /* ... */;
}

2.實現(xiàn)分區(qū)的訪問

其他數(shù)學模塊實現(xiàn)文件可以通過導入這個實現(xiàn)分區(qū)來訪問這些輔助函數(shù)。例如,一個數(shù)學模塊實現(xiàn)文件(math.cpp)可能看起來像這樣:

module math;
import :details;

double Math::superLog(double z, double b) {
    return /* ... */;
}

double Math::lerchZeta(double lambda, double alpha, double s) {
    return /* ... */;
}

當然,使用帶有輔助函數(shù)的這種實現(xiàn)分區(qū)只有在多個其他源文件使用這些輔助函數(shù)時才有意義。


網(wǎng)站標題:C++module編程升級指南,子模塊與分區(qū)全解析
本文路徑:http://www.dlmjj.cn/article/dpscjoj.html