以前一直有了解C++20的新特性,但是因?yàn)榫幾g器對(duì)此支持的比較少,所以很少實(shí)踐。
近期我才知道MSVC已經(jīng)全面支持了C++20的新特性,所以打算全部實(shí)踐一下,最近在MSVC上跑通了modules,這里分享一下modules的使用方法(注意,以下Case僅適用于MSVC上,估計(jì)其它編譯器的使用方式與此有些差異)。
那modules是什么?它有什么作用?
以前C++中想使用外部某個(gè)函數(shù)或變量需要使用#include來引用頭文件,但include這種做法其實(shí)就是把文件的內(nèi)容原封不動(dòng)的復(fù)制過來,如果一個(gè)復(fù)雜的頭文件被好多個(gè)源文件include,那整個(gè)項(xiàng)目的編譯速度也會(huì)降低,而且很多時(shí)候也會(huì)把一些復(fù)雜的宏定義引入進(jìn)來,造成宏污染等等。
而modules就是為了解決這種問題而引入的,它是一種組件思想,一個(gè)module編譯一次后,它的結(jié)果會(huì)被保存在二進(jìn)制文件中,一個(gè)module可以選擇把什么內(nèi)容暴露給外面使用,剩下的只有內(nèi)部可見。其它想使用此module的模塊直接使用即可,無需再次編譯,可以重用。最主要的是,使用modules的項(xiàng)目,編譯速度比include的方式快的多,記得之前看過一組測(cè)試數(shù)據(jù)(好像是哪個(gè)會(huì)議上C++之父貼出來的),modules項(xiàng)目的編譯速度是include的25倍左右。
如果你的項(xiàng)目中已經(jīng)使用了C++20,真的可以考慮把include方式轉(zhuǎn)換為modules方式。
在MSVC中怎么使用modules?
我的編譯器是VS2019,經(jīng)我測(cè)試,想要VS中跑通modules需要一些前置條件,比如需要安裝modules相關(guān)的環(huán)境包,可以在VS installer中安裝:
其次在自己的項(xiàng)目中,需要把C++標(biāo)準(zhǔn)改為C++20或者C++latest:
還有一點(diǎn),需要在VS中啟用modules功能:
這三項(xiàng)都配置后,你應(yīng)該就可以成功使用modules功能了。
看下我的測(cè)試用例:
Example.ixx可以理解為是頭文件,它定義了可以對(duì)外暴露的接口,后綴名是.ixx,開頭以export module name表示該module的名字是name。
前面加了export的修飾的函數(shù)或類表示可以對(duì)外暴露,外部可以使用。而module :private; 后面的表示內(nèi)部的東西,只有內(nèi)部可見和使用,外部不能使用,比如Example.ixx中的PrivateFunc,如果外部使用,編譯時(shí)就會(huì)報(bào)錯(cuò)。
模塊接口文件的后綴名一般是.ixx,實(shí)現(xiàn)接口的文件后綴名和原來的C++一樣,還是.cpp。
看我的Example.cpp,第一行中的module Example,表示在module Example空間,自然而然可以訪問到Example module中的內(nèi)容,這里你也可以看的到,里面定義了ixx中聲明的接口。
那import std.core; 是什么作用?
import表示導(dǎo)入xxx模塊,import后就可以使用對(duì)應(yīng)模塊的功能,比如想要使用std::cout,那就需要import std.core。
那我們以前使用的那些標(biāo)準(zhǔn)庫的函數(shù),都對(duì)應(yīng)什么module?
在MSVC中是這樣:
std.regex提供頭文件
std.filesystem提供頭文件
std.memory提供頭文件
std.threading提供了頭文件
除此之外的功能都由std.core提供。
要使用某些模塊,直接添加import聲明即可:
import std.filesystem; import std.core;
再看下我的main函數(shù)所在的測(cè)試文件:
想要使用Example module中export出的功能,直接import Example即可,剩下的使用方式和以前類似。
介紹到這里,大家就可以在VS中寫一個(gè)modules的Demo了。
動(dòng)手去吧,不要成為學(xué)習(xí)高手,要成為實(shí)戰(zhàn)高手。
更多內(nèi)容在一個(gè)優(yōu)質(zhì)的C++學(xué)習(xí)圈里,來一起鉆研C++和Rust吧。
審核編輯:湯梓紅
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
786瀏覽量
41564 -
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453 -
編譯器
+關(guān)注
關(guān)注
1文章
1617瀏覽量
49015 -
Modules
+關(guān)注
關(guān)注
0文章
10瀏覽量
7983
原文標(biāo)題:C++20 modules入門
文章出處:【微信號(hào):程序喵大人,微信公眾號(hào):程序喵大人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論