av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

C++module編程升級(jí)指南,子模塊與分區(qū)全解析

子模塊

1.C++ 標(biāo)準(zhǔn)與子模塊

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

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

export module datamodel;
import ;

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

Person 和 Address 類(lèi)都在 DataModel 命名空間內(nèi),也在 datamodel 模塊中。可以通過(guò)定義兩個(gè)子模塊來(lái)重構(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 { /* ... */ };
}

最后,定義一個(gè) datamodel 模塊如下。它導(dǎo)入并立即導(dǎo)出兩個(gè)子模塊。

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

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

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

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

3.使用子模塊的好處

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

import datamodel.address;

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

import datamodel;

模塊分區(qū)

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

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

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

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

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

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

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

module datamodel:address;

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

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

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

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

4.編寫(xiě)分區(qū)模塊的要點(diǎn)

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

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

export module datamodel; // datamodel 模塊(主模塊接口文件)
export import :person;   // 導(dǎo)入并導(dǎo)出 person 分區(qū)
export import :address;  // 導(dǎo)入并導(dǎo)出 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ū)在模塊外部不可見(jiàn)。因此,模塊的用戶(hù)不能導(dǎo)入特定分區(qū);他們必須導(dǎo)入整個(gè)模塊。早先提到,模塊名稱(chēng)聲明隱含地包含一個(gè)導(dǎo)入名稱(chēng)聲明。但對(duì)于分區(qū),情況并非如此。例如,datamodel:person 分區(qū)沒(méi)有隱含的 import datamodel 聲明。在這個(gè)例子中,甚至不允許在 datamodel:person 接口分區(qū)文件中添加顯式的 import datamodel 聲明。這樣做會(huì)導(dǎo)致循環(huán)依賴(lài):datamodel 接口文件包含 import :person 聲明,而 datamodel:person 接口分區(qū)文件會(huì)包含 import datamodel 聲明。

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

1.定義和用途

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

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

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

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

2.實(shí)現(xiàn)分區(qū)的訪(fǎng)問(wèn)

其他數(shù)學(xué)模塊實(shí)現(xiàn)文件可以通過(guò)導(dǎo)入這個(gè)實(shí)現(xiàn)分區(qū)來(lái)訪(fǎng)問(wèn)這些輔助函數(shù)。例如,一個(gè)數(shù)學(xué)模塊實(shí)現(xiàn)文件(math.cpp)可能看起來(lái)像這樣:

module math;
import :details;

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

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

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


本文題目:C++module編程升級(jí)指南,子模塊與分區(qū)全解析
標(biāo)題URL:http://uogjgqi.cn/article/dpscjoj.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流