C 20模組介紹

2021-10-10 04:51:57 字數 3416 閱讀 7981

visual studio 2019 v16.8終於支援了c++20模組,有了模組,我們就可以充分結合c++模板的強大特性與物件導向的封裝思想,寫出更易於維護的規模較大的軟體了。

visual c++目前已經實現了c++20模組的幾乎所有內容,也初步加入了工程配置和智慧型提示支援,但截至發文16.8pre6版本,玄學bug還是很多的,有時候重新建幾次工程bug可能就解決了。

1、使用模組

使用同乙個工程的模組很簡單,直接import 模組名;即可。使用不同工程的模組需要在工程屬性設定其它模組依賴項。

模組名可以使用以點分隔的多個識別符號,例如mylib.core,std.開頭的名稱是保留給標準庫的,一般程式不能使用。

2、單檔案模組

單檔案模組副檔名是.ixx,也可以是.cpp,如果用.cpp的話,需要在屬性->c/c++->高階->編譯為裡邊設定編譯為模組**。

單檔案模組由全域性片段module;、介面片段export module 模組名;、實現片段module :private;三部分組成。

全域性片段是用於引入傳統的c/c++標頭檔案的,同時標頭檔案中的內容對於模組使用者是隱藏的,相比傳統方法來說更乾淨更不容易產生名稱汙染。

除此之外,還可以import 《標頭檔案》;import "標頭檔案";引用標頭檔案,與在全域性片段#include不同的一點是,它會單獨編譯該標頭檔案,不受import前面巨集定義的影響,因此有一定的侷限性。

在介面片段使用export關鍵字可以進行內容匯出,匯出的內容可以直接訪問,在介面片段出現但沒有匯出的內容可以間接訪問,但其名稱是隱藏的,僅在實現片段出現的內容其它**不可訪問。

特別地,使用export import 模組名;,可以將其它模組匯出的內容匯入,並在自己的模組匯出。

下面是mylib.core.ixx:

module; // 全域性片段

#include #include // ...

export module mylib.core; // 介面片段,模組名為mylib.core

using namespace std;

export struct fileinfo;

export fileinfo* getfileinfo(string_view filename);

// ...

module :private; // 實現片段

struct fileinfo

;fileinfo* getfileinfo(string_view filename)

;}

3、多檔案模組

多檔案模組可包含介面檔案和實現檔案兩個檔案,至少要包含介面檔案。

介面副檔名是.ixx,也可以是.cpp,如果用.cpp的話,需要在屬性->c/c++->高階->編譯為裡邊設定編譯為模組**。

實現副檔名是.cpp,不需要特殊的設定。

介面檔案只能包含全域性片段module;和介面片段export module 模組名;,下面是mylib.core.ixx:

module; // 全域性片段

#include #include // ...

export module mylib.core; // 介面片段,模組名為mylib.core

using namespace std;

export struct fileinfo;

export fileinfo* getfileinfo(string_view filename);

// ...

實現檔案只能包含全域性片段module;和實現片段module 模組名;,下面是mylib.core.cpp:

module; // 全域性片段

#include #include // ...

module mylib.core; // 實現片段,模組名為mylib.core

using namespace std;

struct fileinfo

;fileinfo* getfileinfo(string_view filename)

;}

4、模組分割槽

模組分割槽是用於多檔案模組組織的一種特殊的子模組,命名方法是模組名:分割槽名

介面檔案檔名是模組名-分割槽名.ixx,包含全域性片段module;和介面片段export module 模組名:分割槽名;

實現檔案檔名是模組名-分割槽名.cpp,包含全域性片段module;和實現片段module 模組名:分割槽名;

分割槽在模組外不能直接訪問,只能在同一模組中使用import :分割槽名;匯入,由於是在同乙個模組內部,因此分割槽的介面檔案中的所有內容均可訪問,包括未匯出的內容。在主介面檔案中使用export import :分割槽名;直接或間接匯出後,其它**才能訪問分割槽介面檔案中匯出的內容。

內部模組分割槽是一種不能匯出任何內容的模組分割槽,只有乙個檔案模組名-分割槽名.cpp,包含全域性片段module;和內部分割槽片段module 模組名:分割槽名;,而且需要在屬性->c/c++->高階->編譯為裡邊設定編譯為模組內部分割槽。

// ---- mylib.ixx ----

export module mylib;

export import :core;

// ---- mylib-internals.cpp ---- 編譯為模組內部分割槽

module;

#include module mylib:internals;

using namespace std;

void internalfunc()

// ---- mylib-core.ixx ----

export module mylib:core;

export void func();

// ---- mylib-core.cpp ----

module;

#include module mylib:core;

import :internals;

using namespace std;

void func()

C 2 0 新增功能

泛型 該語言中新增了一些泛型型別,使得程式設計師能夠實現程度很高的 重用,獲得更高的集合類效能。泛型型別只存在 arity 上的不同。也可以將引數強制為特定的型別。有關更多資訊,請參見泛型型別引數。迭代器 迭代器使得規定 foreach 迴圈將如何迴圈訪問集合的內容變得更加容易。分部類 分部型別定義...

C 2 0 匿名委託

delegate經常被人用來與 相比較,其實兩者在某種程度上由很多共同點。不過delegate有很多更加強大的地方。首先,delegate中可以註冊任意多個 在乙個delegate被呼叫的時候,已經註冊的過程將會被逐個呼叫。其次,delegate允許註冊乙個物件的方法,而不像c 中指可以使用靜態方法...

C 20 標準簡介

早在 2020年9 月份,c 標準委會歷史上規模最大的一次會議 180人參會 在美國san diego召開,這次的會議上討論確定哪些特性要加入到c 20中,哪些特性可能加入到c 20中。c 20 國際標準草案獲得一致通過,c 之父 bjarne stroustrup 就表示 c 20是自c 11以來...