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以來...