精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++ Module詳解:模塊化編程終極指南

開發 前端
模塊的名稱可以是任何有效的 C++ 標識符。名稱可以包含點,但不能以點開頭或結尾,也不能連續包含多個點。

一、模塊接口文件

1.定義和擴展名

模塊接口文件定義了模塊所提供功能的接口。這些文件通常具有 .cppm 擴展名。模塊接口以聲明文件定義了某個名稱的模塊開始,這被稱為模塊聲明。模塊的名稱可以是任何有效的 C++ 標識符。名稱可以包含點,但不能以點開頭或結尾,也不能連續包含多個點。有效名稱的示例包括 datamodel、mycompany.datamodel、mycompany.datamodel.core、datamodel_core 等。

注意:目前,還沒有為模塊接口文件標準化的擴展名。然而,大多數編譯器支持 .cppm(C++ 模塊)擴展名,這也是本書所使用的。請檢查你的編譯器文檔,了解應使用哪種擴展名。


2.導出與模塊接口

模塊需要明確聲明要導出什么,即客戶端代碼導入模塊時應該可見的內容。從模塊導出實體(例如,類、函數、常量、其他模塊等)是通過 export 關鍵字完成的。模塊中未導出的任何內容只在模塊內部可見。所有導出實體的集合稱為模塊接口。

以下是一個名為 Person.cppm 的模塊接口文件示例,定義了一個 person 模塊并導出了一個 Person 類。注意它導入了 <string> 提供的功能。

export module person; // 模塊聲明
import <string>;      // 導入聲明

export class Person   // 導出聲明
{
public:
    Person(std::string firstName, std::string lastName)
        : m_firstName { std::move(firstName) }, m_lastName { std::move(lastName) } { }

    const std::string& getFirstName() const { return m_firstName; }
    const std::string& getLastName() const { return m_lastName; }

private:
    std::string m_firstName;
    std::string m_lastName;
};

3.使用模塊

這個 Person 類可以通過導入 person 模塊在以下代碼中使用(test.cpp):

import person;       // 導入 person 模塊聲明
import <iostream>;
import <string>;    // 用于 std::string 的 operator<<
using namespace std;

int main() {
    Person person { "Kole", "Webb" };
    cout << person.getLastName() << ", " << person.getFirstName() << endl;
}

所有 C++ 頭文件,如 <iostream>、<vector>、<string> 等,都是所謂的可導入頭文件,可以通過導入聲明導入。C++ 中可用的 C 頭文件不保證是可導入的。為了安全起見,對于 C 頭文件應該使用 #include 而不是導入聲明。這樣的 #include 指令應該放在所謂的全局模塊片段中,它必須在任何命名模塊聲明之前,并以無名模塊聲明開始。全局模塊片段只能包含預處理指令,如 #include。這樣的全局模塊片段和注釋是唯一允許出現在命名模塊聲明之前的內容。

例如,如果你需要使用 <cstddef> C 頭文件的功能,可以按照以下方式使其可用:

module; // 開始全局模塊片段
#include <cstddef> // 包含傳統頭文件

export module person; // 命名模塊聲明
import <string>;
export class Person { /* ... */

 };

4.標準術語和導出聲明

在標準術語中,從命名模塊聲明開始直到文件末尾的一切稱為模塊視野。幾乎任何東西都可以從模塊中導出,只要它有一個名稱。示例包括類定義、函數原型、類枚舉類型、使用聲明和指令、命名空間等。如果命名空間使用 export 關鍵字顯式導出,那么該命名空間內的所有內容也會自動導出。例如,以下代碼片段導出了整個 DataModel 命名空間;因此,無需顯式導出各個類和類型別名:

export module datamodel;
import <vector>;

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

你還可以使用導出塊導出一整塊聲明。以下是一個示例:

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

二、模塊實現文件

1.分割接口與實現

一個模塊可以被分割為模塊接口文件和一個或多個模塊實現文件。模塊實現文件通常使用 .cpp 作為擴展名。你可以自由決定將哪些實現移至模塊實現文件,以及保留哪些實現在模塊接口文件中。

一種選擇是將所有函數和方法的實現都移至模塊實現文件中,而只在模塊接口文件中保留函數原型、類定義等。另一種選擇是將小型函數和方法的實現保留在接口文件中,同時將其他函數和方法的實現移至實現文件。在這里,你有很大的靈活性。

模塊實現文件同樣包含一個命名模塊聲明,以指定實現是為哪個模塊服務的,但沒有 export 關鍵字。例如,之前的 person 模塊可以被分割為接口和實現文件,如下所示。這里是模塊接口文件:

export module person; // 模塊聲明
import <string>;

export class Person {
public:
    Person(std::string firstName, std::string lastName);
    const std::string& getFirstName() const;
    const std::string& getLastName() const;

private:
    std::string m_firstName;
    std::string m_lastName;
};

實現現在放在 Person.cpp 模塊實現文件中:

module person; // 模塊聲明,但沒有 export 關鍵字
using namespace std;

Person::Person(string firstName, string lastName)
    : m_firstName { move(firstName) }, m_lastName { move(lastName) } { }

const string& Person::getFirstName() const { return m_firstName; }
const string& Person::getLastName() const { return m_lastName; }

2.實現文件的特點

請注意,實現文件沒有為 person 模塊的導入聲明。module person 聲明隱含地包括了 import person 聲明。同樣值得注意的是,盡管在方法實現中使用了 std::string,實現文件也沒有對 <string> 的任何導入聲明。由于隱含的 import person,以及因為此實現文件是同一個 person 模塊的一部分,它隱含地繼承了模塊接口文件中的 <string> 導入聲明。

相比之下,向 test.cpp 文件添加 import person 聲明并不會隱含地繼承 <string> 導入聲明,因為 test.cpp 不是 person 模塊的一部分。關于這方面有更多內容,在即將到來的“可見性與可達性”一節中進行討論。

注意:模塊接口和模塊實現文件中的所有導入聲明都必須位于文件頂部,在命名模塊聲明之后,但在任何其他聲明之前。與模塊接口文件類似,如果在模塊實現文件中需要任何傳統頭文件的 #include 指令,你應該將它們放在全局模塊片段中,其語法與模塊接口文件相同。

警告:模塊實現文件不能導出任何內容;只有模塊接口文件可以。

三、從實現中分離接口

1.使用頭文件時的建議

當使用頭文件(.h)而非模塊時,強烈建議只在頭文件中放置聲明,并將所有實現移至源文件(.cpp)。這樣做的一個原因是為了提高編譯時間。如果將實現放在頭文件中,任何更改,即使只是修改一個注釋,也需要重新編譯包含該頭文件的所有其他源文件。對于某些頭文件,這可能會導致整個代碼庫的全面重新編譯。通過將實現放在源文件中,不觸及頭文件的情況下對這些實現進行修改,意味著只需要重新編譯那個單獨的源文件。

2.模塊的不同工作方式

模塊的工作方式不同。模塊接口僅包括類定義、函數原型等,但不包括任何函數或方法的實現,即使這些實現直接位于模塊接口文件中。因此,更改模塊接口文件內的函數或方法實現,只要不觸及接口部分(例如,函數頭 = 函數名、參數列表和返回類型),就不需要重新編譯使用該模塊的用戶。

有兩個例外:使用 inline 關鍵字標記的函數/方法,以及模板定義。對于這兩者,編譯器需要在編譯使用它們的客戶端代碼時了解它們的完整實現。因此,對 inline 函數/方法或模板定義的任何更改都可能觸發客戶端代碼的重新編譯。

注意:當頭文件中的類定義包含方法實現時,這些方法即使沒有標記 inline 關鍵字,也會被隱式地視為內聯。但這對于模塊接口文件中類定義中的方法實現不成立。如果這些需要被內聯,它們需要被顯式地標記為此。

盡管從技術上講,不再需要將接口與實現分離,但在某些情況下,我仍然建議這樣做。主要目標應該是擁有清晰易讀的接口。只要函數的實現不會遮蔽接口,使用戶難以快速理解公共接口提供了什么,就可以保留在接口中。例如,如果一個模塊有一個較大的公共接口,最好不要用實現來遮蔽該接口,這樣用戶可以更好地了解所提供的內容。然而,小的 getter 和 setter 函數可以保留在接口中,因為它們對接口的可讀性影響不大。

從實現中分離接口可以通過幾種方式完成。一種選擇是將模塊分為接口和實現文件,如前一節所討論的。另一種選擇是在單個模塊接口文件內分離接口和實現。例如,以下是在單個模塊接口文件(person.cppm)中定義的 Person 類,但將實現與接口分離:

export module person;
import <string>;

// 類定義
export class Person {
public:
    Person(std::string firstName, std::string lastName);
    const std::string& getFirstName() const;
    const std::string& getLastName() const;

private:
    std::string m_firstName;
    std::string m_lastName;
};

// 實現
Person::Person(std::string firstName, std::string lastName)
    : m_firstName { std::move(firstName) }, m_lastName { std::move(last

Name) } { }

const std::string& Person::getFirstName() const { return m_firstName; }
const std::string& Person::getLastName() const { return m_lastName; }

四、可見性與可達性

1.引入模塊的影響

正如之前提到的,當你在非 person 模塊的另一個源文件中導入 person 模塊(例如在 test.cpp 文件中),你并沒有隱含地繼承 person 模塊接口文件中的 <string> 導入聲明。因此,如果沒有在 test.cpp 中顯式導入 <string>,std::string 名稱將不可見,意味著以下突出顯示的代碼行將無法編譯:

import person;

int main() {
    std::string str;
    Person person { "Kole", "Webb" };
    const std::string& lastName { person.getLastName() };
}

然而,即使沒有向 test.cpp 添加 <string> 的顯式導入,以下代碼行仍能正常工作:

const auto& lastName { person.getLastName() };
auto length { lastName.length() };

2.為什么這樣工作?

在 C++ 中,實體的可見性和可達性是不同的。通過導入 person 模塊,<string> 中的功能變得可達但不可見。可達類的成員函數自動變得可見。這意味著你可以使用 <string> 中的某些功能,例如使用 auto 類型推導將 getLastName() 的結果存儲在變量中,并在其上調用諸如 length() 之類的方法。

要使 std::string 名稱在 test.cpp 中可見,需要顯式導入 <string>。當你想使用例如 operator<< 這樣的功能時,也需要這樣的顯式導入。這是因為 operator<< 不是 std::string 的方法,而是一個非成員函數,只有導入 <string> 后才會變得可見。

cout << person.getLastName() << endl;
責任編輯:趙寧寧 來源: coding日記
相關推薦

2017-05-18 10:23:55

模塊化開發RequireJsJavascript

2024-01-01 22:06:02

C++模塊編程

2018-03-21 21:31:28

Java9編程Java

2012-11-08 09:45:44

JavaScriptrequireJS

2011-05-13 15:54:50

C模塊化

2022-11-02 18:47:46

場景模塊化跨棧

2019-08-28 16:18:39

JavaScriptJS前端

2025-06-26 02:00:00

2010-08-18 09:03:07

模塊化路由器

2010-08-16 13:49:39

模塊化路由器

2010-01-20 09:14:49

C語言模塊化

2009-08-17 10:11:12

C# Windows

2011-05-13 15:46:49

C模塊化

2010-01-21 09:27:30

模塊化的優點NetBeans

2010-03-11 17:24:27

Python編程語言

2024-07-01 12:48:00

C++內部類開發

2012-11-08 10:21:41

JSrequireJavaScript

2025-05-12 08:45:00

模塊化FastAPI路由分發

2023-07-03 08:48:40

Web模塊化設計

2023-05-23 18:31:14

Rust編程
點贊
收藏

51CTO技術棧公眾號

深夜福利视频一区二区| 亚洲经典一区二区| 不卡中文字幕| 日韩欧美一级二级| 国产av麻豆mag剧集| 酒色婷婷桃色成人免费av网| 精品一区二区三区视频| 欧美激情精品久久久久久大尺度 | 国产无限制自拍| 毛片在线播放网站| 国产精品一区二区三区网站| 欧美一区二区三区……| 尤物在线免费视频| 免费成人高清在线视频theav| 欧美电影一区二区| 青青草国产精品视频| 香蕉视频免费在线播放| 91免费精品国自产拍在线不卡| 成人精品久久久| 中文字幕亚洲高清| 91成人网在线观看| 国产亚洲激情在线| 免费a v网站| 精品视频在线观看免费观看| 欧美在线视频不卡| 久久久亚洲国产精品| 黄色在线播放网站| 国产精品免费久久久久| 久久国产精品一区二区三区四区| va视频在线观看| 免费观看成人av| 奇米一区二区三区四区久久| 欧美成欧美va| 91综合在线| 这里只有精品在线播放| 亚洲黄色免费在线观看| 九色丨蝌蚪丨成人| 日韩免费观看高清完整版在线观看| 538在线视频观看| 超碰一区二区| 日韩欧美一区二区三区久久| 黄色网址在线免费看| 中文字幕日本在线观看| 国产午夜精品福利| 欧美精品亚洲精品| 三级无遮挡在线观看| 99精品欧美一区| 国产一区二区在线网站| 亚洲黄色a级片| 成人夜色视频网站在线观看| 国产福利一区二区三区在线观看| 国产三级在线观看视频| 看片的网站亚洲| 国产一区私人高清影院| 中文字幕在线2018| 蜜桃视频在线一区| 国产欧美日韩中文字幕在线| 在线观看免费观看在线| 九色|91porny| 亚洲xxx视频| 亚洲精品国产片| 成人免费观看视频| 免费国产一区| 成人免费在线电影| 国产精品久久久久久久久久久免费看| 日韩三级在线播放| 日本在线观看免费| 亚洲欧美激情插| 日本男女交配视频| av漫画网站在线观看| 亚洲777理论| 欧美成人免费高清视频| 成人交换视频| 日韩欧美一区在线| 在线观看国产三级| 狠狠色丁香婷婷综合影院| 一本大道久久加勒比香蕉| 妖精视频在线观看免费| 久久久久久美女精品| 久久久久久久久久久免费精品| 青青国产在线观看| 免费成人性网站| 99理论电影网| 免费av在线电影| 国产精品久久久久久久久久免费看| 国产又粗又长又爽视频| 亚洲美女炮图| 7777精品伊人久久久大香线蕉完整版| 美女被爆操网站| 蜜桃成人av| 欧美成人中文字幕在线| 日韩精品在线不卡| 美日韩一级片在线观看| 99re视频在线播放| 蜜桃免费在线| 亚洲精品自拍动漫在线| 国产午夜福利视频在线观看| 欧美成人福利| 日韩黄色av网站| 亚洲天堂黄色片| 久久精品欧洲| 国产精品国产亚洲精品看不卡15 | 久久久久久久久久看片| 综合网五月天| 精品国产第一福利网站| 欧美一区永久视频免费观看| 成人网站免费观看| 欧美777四色影| 国产精品久久久久久久久久新婚| 亚洲高清精品视频| 国产精品嫩草影院av蜜臀| 东北少妇不带套对白| 欧美成人毛片| 亚洲欧洲免费视频| 久久精品视频8| 国产在线播放一区二区三区| 欧美日韩三区四区| 搞黄网站在线看| 欧美日高清视频| 欧美日韩高清丝袜| 91久久视频| 亚洲最大福利视频| 日本成人网址| 欧美亚一区二区| 这里只有久久精品| 亚洲国产高清一区| 99r国产精品视频| 浪潮av一区| 欧美精品 国产精品| 乐播av一区二区三区| 在线视频亚洲| 国产精品免费一区二区| а√天堂在线官网| 在线不卡欧美精品一区二区三区| 日韩毛片无码永久免费看| 国产视频久久| 国产日韩在线一区二区三区| 污污的视频在线观看| 91精品国产麻豆| 亚洲 欧美 国产 另类| 日本网站在线观看一区二区三区 | 国产精品av网站| 天天影院图片亚洲| 欧美日韩一区二区三区| 久久一区二区电影| 国产欧美丝祙| 免费中文日韩| 色老太综合网| 一区二区在线视频播放| 在线观看亚洲黄色| 国产精品视频你懂的| 亚洲少妇久久久| 91亚洲一区| 亚洲综合精品一区二区| xvideos国产在线视频| 91精品国产色综合久久不卡电影 | 国产黄色在线| 欧美色精品天天在线观看视频| 一级特黄曰皮片视频| 日本sm残虐另类| 一区二区视频国产| 九九99久久精品在免费线bt| 欧美人在线观看| 日韩有码第一页| 色av一区二区| 国产91在线播放九色| 精品在线一区二区| 国产传媒久久久| 欧洲精品一区| 国产精品自产拍在线观看中文| 快射av在线播放一区| 日韩免费电影网站| 啦啦啦免费高清视频在线观看| 久久九九国产精品| 加勒比av中文字幕| 亚洲激情欧美| 先锋影音一区二区三区| 日本精品视频| 91高清视频免费| 日韩黄色影院| 精品久久久久久久久久久久久久久 | 成人在线观看一区| 欧美一级免费观看| 天天爽夜夜爽夜夜爽精品| 国产亚洲自拍一区| 亚洲天堂一区二区在线观看| 亚洲免费精品| 亚洲在线观看一区| 果冻天美麻豆一区二区国产| 国产精品va在线播放| 色婷婷av在线| 国产亚洲人成a一在线v站| 国产女无套免费视频| 欧美午夜激情在线| 亚洲最大的黄色网址| 26uuu久久综合| 久久综合在线观看| 首页国产欧美久久| 真实国产乱子伦对白视频| 五月激激激综合网色播| 91免费精品视频| 韩漫成人漫画| 韩国19禁主播vip福利视频| 国产免费永久在线观看| 亚洲精品一区二区三区精华液| www.亚洲激情| 一本色道久久综合亚洲91| 1024手机在线视频| 国产精品麻豆久久久| 在线精品一区二区三区| 国产精品系列在线播放| 一本久道综合色婷婷五月| 黄色成人在线网址| 午夜探花在线观看| 国产精品一区高清| 精品乱子伦一区二区三区| 国产精品毛片无码| 国产精品女视频| 在线日韩影院| 97视频在线免费观看| 丝袜美女在线观看| 久久高清视频免费| 天堂中文а√在线| 国产午夜精品全部视频播放| 亚州av在线播放| 亚洲精品一区二区精华| 国产白浆在线观看| 91精品国产综合久久蜜臀| 一区二区三区在线免费观看视频| 色噜噜狠狠色综合欧洲selulu| 99视频在线看| 精品久久中文字幕久久av| 久久免费少妇高潮99精品| 亚洲日本一区二区三区| 911国产在线| 国产精品美女一区二区| a资源在线观看| 国产欧美一区二区精品性| 国产av自拍一区| 国产拍揄自揄精品视频麻豆| 色无极影院亚洲| 久久久久久久综合| xxxx日本黄色| 国产精品天干天干在线综合| a天堂中文字幕| 亚洲国产精品传媒在线观看| 日本综合在线观看| 国产精品久久久久久久久免费樱桃| 东方伊人免费在线观看| 国产人久久人人人人爽| 天天操天天舔天天射| 亚洲国产高清在线| 久久久久99精品成人| 国产精品乱码人人做人人爱| 综合 欧美 亚洲日本| 国产精品二三区| 色在线观看视频| 图片区小说区国产精品视频| 欧美啪啪小视频| 色又黄又爽网站www久久| 免费黄色片视频| 欧美日韩一区二区三区不卡| 国产乱色精品成人免费视频| 日韩一区二区不卡| 欧美熟妇另类久久久久久不卡 | 91成人在线免费观看| 黄色大全在线观看| 制服丝袜亚洲播放| 成人高潮片免费视频| 日韩精品免费在线视频观看| 亚洲欧洲视频在线观看| 有码中文亚洲精品| 污影院在线观看| 欧美一级片在线播放| 成人精品动漫| 国产精品初高中精品久久| 欧美亚洲国产日韩| 五月婷婷一区| 欧美日韩日本国产亚洲在线 | 曰韩不卡视频| 欧美日韩国产色综合一二三四| 国产青青在线视频| 蜜臀av在线播放一区二区三区| 亚洲高清av一区二区三区| 北条麻妃国产九九精品视频| 99久久精品免费视频| 亚洲色图在线播放| 欧美三日本三级少妇99| 在线视频一区二区三| 国产精品视频一区二区三区,| 亚洲国产精彩中文乱码av| 福利片在线看| 欧美激情亚洲视频| 欧美日韩精品一区二区三区视频| 3d动漫啪啪精品一区二区免费 | 亚洲色图美腿丝袜| 91精品久久久| 国产精品九九九| av日韩在线播放| 亚洲一卡二卡| 国产欧美短视频| 18深夜在线观看免费视频| 久久久久久久久久看片| 久久老司机精品视频| 欧美午夜电影网| 五月天婷婷激情网| 久青草国产97香蕉在线视频| 天天免费亚洲黑人免费| 不卡一区二区三区视频| 色777狠狠狠综合伊人| 欧美日韩在线视频一区二区三区| 国产一区二区三区香蕉| 一级肉体全黄裸片| 黑人精品xxx一区| 成人免费公开视频| 久久精品国产成人| yy6080久久伦理一区二区| 欧美精品123| 国产欧美一区二区色老头 | 综合久久av| 日韩视频在线播放| 国产精品综合色区在线观看| 一级黄色电影片| 亚洲一区中文日韩| 国产免费黄色片| 久久久精品视频成人| av亚洲一区| 日韩中文一区二区三区| 亚洲欧美久久久| 亚洲男人在线天堂| 婷婷开心激情综合| 日韩在线视频观看免费| 欧美韩国理论所午夜片917电影| 不卡一区视频| 亚洲第一综合网站| 精品一区二区三区视频在线观看| 日本爱爱爱视频| 欧美性猛交一区二区三区精品| 国产综合在线观看| 国产成人精品一区二区在线| 欧美极品中文字幕| 激情五月亚洲色图| 国产日韩欧美高清| 最近中文字幕免费观看| 国产亚洲视频在线| 免费观看成人性生生活片 | 超碰国产在线观看| 日韩美女视频免费看| 亚洲自拍电影| 人妻无码视频一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 国产女主播喷水视频在线观看 | 强制高潮抽搐sm调教高h| 欧美精选在线播放| sm国产在线调教视频| 97中文在线观看| 亚洲高清二区| 色婷婷av777| 欧美色国产精品| 综合久久2019| 久久精品成人一区二区三区蜜臀| 久久久人人人| 开心激情五月网| 欧美mv和日韩mv的网站| 成人免费图片免费观看| 免费在线国产精品| 老司机精品视频在线| 成年人av电影| 亚洲精品国产综合久久| 日本欧美不卡| www.激情网| 久久综合九色综合欧美就去吻| 一区二区乱子伦在线播放| www.色综合| 老司机精品视频在线播放| 天天碰免费视频| 一区二区三区四区国产精品| 色呦呦中文字幕| 国产精品网站视频| 午夜性色一区二区三区免费视频| av无码一区二区三区| 欧美性三三影院| 免费在线国产视频| 欧美在线一区二区三区四区| 韩国精品久久久| 日本午夜视频在线观看| 最近免费中文字幕视频2019| 亚洲大奶少妇| 国产一级特黄a大片免费| 亚洲综合免费观看高清在线观看 | 精品国产美女在线| 懂色av一区二区| 五月婷婷狠狠操| 午夜久久久影院| 国产三区在线观看| 九九99玖玖| 国产伦精品一区二区三区免费迷| 特级毛片www| 久久久久国产精品www| 欧美三级美国一级|