最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Hello World 能有什么難度?C++20 # C++ 23

2023-03-02 23:28 作者:緊果唄  | 我要投稿

各位看官,實不相瞞,以在下十幾年混跡于 PL 行業(yè)的底層,寫得一手好 Hello world,風(fēng)格各異,不下幾十種姿勢。今天就來表演一下 C/C++/C++20 的 Hello world。內(nèi)容按以下三個主題組織:

# =?? Hello World from C to C++23

## ==? GCC Clang & C++20?

## ==? MSVC & C++20

代碼及配置相關(guān)文件可以前往此處獲取 [Tour of C++ 2023](https://github.com/Jeangowhy/Tour-of-C-2023)


為了跟得上三大流編譯器的足跡,需要提前安裝好相應(yīng)開發(fā)環(huán)境,本機(jī)當(dāng)前配置:

Windows: Visual Studio 2019 / 2022 社區(qū)版,LLVM Clang 14,MinGW-w64? GCC 12.2

Windows WSL:Homebrew 環(huán)境下安裝 GCC 12.2 和 Clang 15

- http://www.cplusplus.com/reference/cstdio/

- http://www.cplusplus.com/reference/iostream/cout/

- [MSYS2](https://www.msys2.org/docs/what-is-msys2/)

- [Pacman Wiki](https://wiki.archlinux.org/title/Pacman)

- [Pacman Base Packages](https://packages.msys2.org/base)

- [Installing GCC](https://gcc.gnu.org/install/index.html)

- [MinGW-w64](https://www.mingw-w64.org/downloads/)

- [LLVM Project](https://github.com/llvm/llvm-project/releases)

PS: Godot 4.o 發(fā)布了,為了這 Hello World from C to C++23,我下載好的 Godot 4 RC5/6 都沒時間打開來看。有個消息就是,Godot 4 臨門一腳,把 Mono 換【踢】了,用了 .Net 6.0 ,只支持桌面 C# 開發(fā),好處就是可以使用 C# 10.0。下載請這邊來 https://godotengine.org/download/windows/?

配置 Godot C++/C# VScode 開發(fā)環(huán)境,請這邊來?Godot C++/C# VScode Settings


Hello World! for C


Hello World! for C++


Hello World! for C++20

模塊化是 C++20 最重要的兩個特性之一,另一個是協(xié)程 (Coroutine)。模塊化引入可以解決從 C 語言中繼承下來的 include 機(jī)制存在的問題:

- 模糊的模塊邊界;

- 循環(huán)處理導(dǎo)致編譯效率低下;

- 宏展開會導(dǎo)致符號污染,也就是命令空間污染問題;


從 C 開始,標(biāo)準(zhǔn)庫頭文件就使用 .h 文件,但是在 C++ 引入 Standard Library 并不需要指定擴(kuò)展名。比如 <iostream> 以及其它標(biāo)準(zhǔn)庫,都定義在 std namespace 或者子命名空間內(nèi)。

但是,C++ 依然為 C 標(biāo)準(zhǔn)庫保留了兩種形式,首先,是推薦使用的無擴(kuò)展名的版本,如 <cstdio>,所有這些標(biāo)準(zhǔn)庫都定義在 std 命名空間中。其次,是舊版本,像 C 語言中一樣使用 .h 后綴擴(kuò)展名,它們沒有定義命名空間


比如,引入 <stdio.h> 這個標(biāo)準(zhǔn)庫,它就是不使用 namespaces 特性的庫。


需要注意的是,C++20 的模塊方式下,所有 C 標(biāo)準(zhǔn)庫不保證可以通過 import 導(dǎo)入,為了安全起見,應(yīng)該使用 include 導(dǎo)入指令,而不是 import 導(dǎo)入。


要編譯使用了 modules 特性的 C++ Hello World 是相當(dāng)有門檻的,至少在目前階段來說,大部分編譯器沒都沒支持到模塊化,即使用是最新的編譯器,對 C++ 模塊化支持也是部分功能的支持。


GCC 12.2 和 Clang 13.0.0 都不支持 std::format 模塊功能?;蛘吒_切地說,他們的標(biāo)準(zhǔn)庫實現(xiàn)不支持它。Clang 14.0.0 的 libc++ 或者 GCC 13 libstdc++ 支持,但仍標(biāo)記為不完整的功能。目前標(biāo)準(zhǔn)庫還未曾實現(xiàn)模塊化,也就不能使用 import 導(dǎo)入標(biāo)準(zhǔn)庫,否則報錯:

? ? cannot be imported because it is not known to be a header unit

Standard Library Header Units 即標(biāo)準(zhǔn)庫的標(biāo)頭單元,標(biāo)頭單元是頭文件和 C++ 20 模塊中間步驟。


標(biāo)頭單元和頭文件之間的一個重要區(qū)別是,標(biāo)頭單元不受標(biāo)頭單元之外的宏定義的影響。 也就是說,不能定義導(dǎo)致標(biāo)頭單元行為不同的預(yù)處理器符號,避免宏定義產(chǎn)生符號污染。導(dǎo)入標(biāo)頭單元時,就已經(jīng)編譯了標(biāo)頭單元。這與處理文件的方式 #include 不同。 包含的文件可能會受到頭文件外部的宏定義的影響,因為在編譯包含它的源文件時,頭文件會經(jīng)過預(yù)處理器。


必須將頭文件轉(zhuǎn)換為標(biāo)頭單元,才能導(dǎo)入該頭文件。GCC 使用 -x c++-system-header 參數(shù)生成標(biāo)頭單元,生成文件在 gcm.cache 目錄下。模塊引入要嚴(yán)格遵守 modules 之間的依賴關(guān)系,被依賴的一定要放在前面。


但是,只要編譯器還不支持 std::format(),就可以使用免費(fèi)提供的 {fmt} 庫作為替換。下載?{fmt} 庫文件,將其中的 include/fmt 和 src 目錄復(fù)制為項目中的 fmt 和 src 子目錄。然后,根據(jù)需要引入 `fmt/core.h`, `fmt/format.h`, `fmt/format-inl.h`, `src/format.cc` 等等文件。

- https://fmt.dev/?

- https://github.com/fmtlib/fmt

- [C++ iostream 的用途與局限](https://www.cnblogs.com/Solstice/archive/2011/07/17/2108715.html)

> C++ iostream 的主要作用是讓初學(xué)者有一個方便的命令行輸入輸出試驗環(huán)境,在真實的項目中很少用到 ?iostream,因此不必把精力花在深究 iostream 的格式化與 manipulator。iostream 的設(shè)計初衷是提供一個可擴(kuò)展的類型安全的 IO 機(jī)制,但是后來莫名其妙地加入了 locale 和 facet 等累贅。其整個設(shè)計復(fù)雜不堪,多重+虛擬繼承的結(jié)構(gòu)也很巴洛克,性能方面幾無亮點。iostream 在實際項目中的用處非常有限,為此投入過多學(xué)習(xí)精力實在不值。

C 語言的 stdio 庫函數(shù)安全性問題比較嚴(yán)重,C99 增加了 snprintf() 等能夠指定輸出緩沖區(qū)大小的函數(shù),輸出方面的安全性問題已經(jīng)得到解決;輸入方面似乎沒有太大進(jìn)展,還要靠程序員自己動手。另外,擴(kuò)展性不夠,因為直接使用 FILE* 輸入輸出數(shù)據(jù)流,用戶數(shù)據(jù)類型需要額外的處理。


C++ 設(shè)計 iostream 的初衷包括克服 C stdio 的缺點,提供一個高效的可擴(kuò)展的類型安全的 I/O 機(jī)制?!翱蓴U(kuò)展”有兩層意思,一是可以擴(kuò)展到用戶自定義類型,而是通過繼承 iostream 來定義自己的 stream,“類型可擴(kuò)展”和“類型安全”都是通過函數(shù)重載來實現(xiàn)的,也解決了舊有的安全性(security)方面的問題。


但是,C++ 添加了太多額外的功能,總想著考慮周全,這使得它變得非常沉重。其中一就是本地化功能,The Standard C++ Locale by Nathan C. Myers,所以在需要 I/O 性能優(yōu)化的應(yīng)用中慎用。


參考第三 key-value db:

- [Google leveldb](http://code.google.com/p/leveldb)

- [Kyoto Cabinet](http://fallabs.com/kyotocabinet/)

## ==? GCC Clang & C++20

C++ 作為向后兼容 C 語言的一種系統(tǒng)底層高級編程語言,它的編譯流程也基本和 C 語言的編譯流程一致。C 語言在貝爾實驗室剛誕生時,由于當(dāng)時的計算機(jī)資源相當(dāng)有限,其內(nèi)存無法完全表示大型源文件的語法樹。所以,為了能夠編譯大型項目,Dennis Ritchie 采用了分開編譯源文件,最后鏈接形成可執(zhí)行文件的編譯單元化思想,讓大文件的編譯成為可能。


早期的 C 語言編譯器也并不像現(xiàn)代的編譯器做一個單獨的可執(zhí)行程序,Dennis Ritchie 為 PDP-11 編寫的 C 語言編譯器由七個可執(zhí)行文件組成:cc/cpp/as/ld/c0/c1/c2。編譯的步驟為:


01. 預(yù)編譯:cpp 預(yù)處理器首先處理 #define,#Include 等指令,以及展開宏定義;

02. 編譯:cc c0 c1 c2 編譯器將源代碼轉(zhuǎn)化匯編代碼;

03. 匯編:as 匯編程序?qū)R編代碼轉(zhuǎn)化為目標(biāo)文件,并生成符號表,包括無定義的符號;

04. 鏈接:ld 連接器將多個源文件鏈接成可執(zhí)行文件,處理上一步留下的無定義符號鏈接問題;


現(xiàn)在的編譯器也很多是由單獨功能的程序模塊組成的編譯工具鏈,如 GCC 編譯器編譯 C++ 程序分步驟流程:


- 預(yù)處理: gcc -E

- 編譯: gcc -S

- 匯編: gcc -c?

- 鏈接: gcc -o 指定輸出


預(yù)處理程序 preprocessor 是 C++ 編程中相當(dāng)重要的一個階段,它相當(dāng)于是一個代碼生成器,通過宏定義的展開,可以實現(xiàn)復(fù)雜的程序結(jié)構(gòu)。C++20 從頭文件引用轉(zhuǎn)換到模塊引用,其中一個問題就是頭文件的預(yù)處理。

當(dāng)下,Clang 作為一個優(yōu)秀的編譯器前端與 LLVM 編譯器架構(gòu)一起發(fā)揚(yáng)光大,無論是對 C/C++ 規(guī)范的支持,編譯速度,還是錯誤信息的友好度都是業(yè)界領(lǐng)先。無論是在工程,還是平時使用,Clang 都是一個可以作為第一選擇的編譯器。

關(guān)于 LLVM 編譯器構(gòu)架的介紹,參考Compilers Architecture 編譯器構(gòu)架

C/C++ Support in Clang

C++20 是有史以來最大的 C++ 版本更新,但是不知什么原因它又沒有完全完工,是疫情版完成了后續(xù)的工作,C++23 “Pandemic Edition” is complete。要使用最新的功能,需要 GCC 11 或 CLang 12 版本。GCC 10.9 開始基礎(chǔ)運(yùn)行庫命名為 libc++,早期的版本則默認(rèn)為 libstdc,可以按需要安裝指定版本。


雖然 C++20 開始引入模塊化概念,但目前來說仍然不成熟,它需要解決的問題包含:


01. **Rewrite the world’s code**: 不向后兼容(歷史包袱)扔掉頭文件就需要重寫整個工業(yè)基礎(chǔ)庫。

02. **Versioning**: 模塊沒有版本概念,開發(fā)者必須依賴語言底層的版本控制機(jī)制。

03. **Namespaces**: 與某些語言不同,模塊并不暗示任何命名空間的概念,不同模塊存在同名沖突。

04. **Binary distribution of modules**: 頭文件,特別是 C++ 的頭文件暴露了語言的全部復(fù)雜性。在體系結(jié)構(gòu)、編譯器版本和供應(yīng)商之間,在技術(shù)上保持穩(wěn)定的二進(jìn)制模塊格式不可行。


C++20 Modules 編譯器支持度:


或者使用 VS 2022,當(dāng)然,VS 2019(MSVC 16.8)已經(jīng)開始支持模塊,安裝“用于 v142 生成工具的 C++ 模塊(實驗性)”,即可以獲得模塊化的標(biāo)準(zhǔn)庫。


標(biāo)頭單元是頭文件的二進(jìn)制表示形式,各家編譯器使用不同擴(kuò)展名。標(biāo)頭單元文件是預(yù)編譯內(nèi)容的緩存文件,相當(dāng)于編譯出來的 object,鏈接的時候直接可用,比起頭文件的嵌套處理快速多了。

[P1838R0: Modules User-Facing Lexicon and File Extension](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1838r0.pdf)


暫且將有點軟的格式詞庫 Industry Foundation Class(IFC),其格式規(guī)范旨在定義一種用于在高抽象級別上描述 C++ 程序或程序片段語義的二進(jìn)制格式,然后降為機(jī)器代碼或類似代碼。


格式化工具庫的支持目前只有 MSVC 16.10 完全支持,Clang 14 使用 -stdlib=libc++ 支持,相對落后一點的 GCC 12.2 還不支持:


- [Text formatting in C++ using libc++](https://blog.llvm.org/posts/2022-08-14-libc++-format/)

- https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2020

- https://libcxx.llvm.org/Status/Cxx20.html

- https://github.com/fmtlib/fmt


而標(biāo)準(zhǔn)庫模塊化方面,GCC 和 Clang 都沒有提供,VS 2019 16.10 版本以上則可以支持。Clang 15 支持規(guī)范標(biāo)準(zhǔn):

以下使用 Homebrew 安裝的 clang version 15.0.7,以及 GCC 12.2.0。

Clang 模塊的一些定義規(guī)則:


- 模塊文件使用 .cppm 擴(kuò)展名,不像 GCC 可以使用支持的多個擴(kuò)展名;

- 模塊代碼中以 `module;` 打頭,但是 `export module` 語句要在 include 指令后面;

- 使用 --precompile 指令預(yù)編譯模塊時,輸出名稱要和源文件名一致;


模塊定義以及測試參考如下,使用 Clang 編譯時,一定要保存為 .cppm 文件。如果使用 GCC 編譯,則寬松很多,保存為 .cc 或 .cxx .cpp 都是可以的,并且也不要求導(dǎo)出模塊名稱與文件名一致。不過,為了一致,還是保持一致的模塊名與文件名為好。


Clang 參考編譯命令:

因為當(dāng)前 GCC 或 Clang 還未提供標(biāo)準(zhǔn)庫模塊化支持,導(dǎo)入標(biāo)準(zhǔn)庫時,就需要手動編譯標(biāo)頭單元文件。與用戶定義的命名模塊類似,使用 --precompile 編譯標(biāo)頭單元文件生成 BMI,但是還需要額外指令,以下任選一種:


- 通過 -xc++-system-header-xc++-user-header 指定輸入文件是頭文件。

- 通過 -fmodule-header={user,system} 選項為 .h 或 .hh 文件生成 BMI。


默認(rèn)值為 -fmodule-header=user,即相當(dāng)于 MSVC 中使用 /headerUnit:quote 類似,按用戶搜索路徑定位標(biāo)頭文件??梢远啻问褂?-fmodule-file 以指定多個 BMI 文件。


GCC 在文件擴(kuò)展名上的設(shè)計選擇是,不支持新的拓展名,只支持原有的 .cc, .cxx, .cpp 等等拓展名。目前 GCC 12.2 還沒有提供 <format> 標(biāo)準(zhǔn)庫,使用 {fmt} 庫替代。

GCC 編譯命令參考,使用 PowerShell:

Windows 系統(tǒng)上,可以安裝最新版本 MinGW-w64 編譯工具以使用 GCC 12.2。Windows WSL 系統(tǒng)下可以使用 Homebrew 管理工具安裝最新的 GCC 12。

但是,這個版本的 Link Time Optimization (LTO) 插件依賴更新的 GLIBC 2.33,沒有更新到位就會導(dǎo)致鏈接失敗。libLTO 插件作為 LLVM 的一部分,也是模塊間優(yōu)化 intermodular optimization, 一種用于代碼鏈接階段的優(yōu)化技術(shù)。是優(yōu)化代碼的一系列編譯器優(yōu)化技術(shù)的集合,不同于其他的優(yōu)化技術(shù),LTO 聚焦于分析整個程序代碼。

? ? ~/homebrew/Cellar/gcc/12.2.0/libexec/gcc/x86_64-pc-linux-gnu/12/liblto_plugin.so:?

? ? error loading plugin:?

? ? ? ? /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found

? ? ? ? (required by liblto_plugin.so)

WSL 軟件倉庫沒有提供最新版,只好從源代碼構(gòu)建,根據(jù)網(wǎng)絡(luò)速度選擇下載 gz 或更大壓縮率的 xz:

Linux 系統(tǒng)安裝軟件的基本流程是:configure → make → make install。配置文件是一個可執(zhí)行腳本,其中 -–prefix 選項是配置安裝的路徑,如果不配置該選項,默認(rèn)安裝行為如下:

- 可執(zhí)行文件放在 /usr/local/bin

- 庫文件放在 /usr/local/lib

- 配置文件默認(rèn)放在 /usr/local/etc

- 其它的資源文件放在 /usr/local/share


通過指定配置 -–prefix,可以把所有資源文件放在指定路徑下,統(tǒng)一管理,此選項方便卸載軟件或移植軟件。

- [LLVM Link Time Optimization: Design and Implementation](https://www.llvm.org/docs/LinkTimeOptimization.html)

- [The GNU C Library (glibc)](https://www.gnu.org/software/libc/)

std::format 格式化參考:

擴(kuò)展格式化接口,實現(xiàn)自定義類型格式化輸出:

LLVM 子項目 libc++ 目前只支持類 Linux 平臺,Windows 平臺上只能借用 MSVC 或者 MingGW 提供的 C++ 運(yùn)行庫。官方文檔表示 Clang 不是 MSVC 的替代品,而是補(bǔ)充。

通過 -fuse-ld=<linker name> 可以指定以下任何一種支持的鏈接程序:


01. GNU ld

02. GNU gold

03. LLVM’s lld

04. MSVC’s link.exe

Link-time optimization 原生支持持鏈接期優(yōu)化,使用 gold 時通過鏈接程序插件支持。


Clang 支持以下兩種 C++ standard library 實現(xiàn),使用 -stdlib 參數(shù)的設(shè)置:

01. LLVM’s libc++,此庫旨在成為從 C++11 開始的 C++ 標(biāo)準(zhǔn)完整實現(xiàn),-stdlib=libc++ 。

02. GCC’s libstdc++,Clang 支持 libstdc++4.8.3 及更高版本,-stdlib=libstdc++。


另外,Clang 版本需要和 Visual Sutio 版本匹配,版本不匹配會出現(xiàn)編譯或鏈接問題。Visual Studio 2022 安裝包本身也提供了 Clang 15 編譯器。如果已經(jīng)手動下載安裝了 LLVM Clang 14 則可以搭配 VS 2019 使用,注意 x86 或者 x86_64 也對應(yīng),兩者版本不匹配就會出現(xiàn)編譯問題。

? ? STL1000, "Unexpected compiler version, expected Clang 15.0.0 or newer."

另外,-fprebuilt-module-path 目錄設(shè)置為 . 可能引起無法打開當(dāng)前目錄的問題,需要指定絕對路徑:

? ? LINK : fatal error LNK1104: 無法打開文件“.”

在 Windows 下使用 Powershell 執(zhí)行編譯命令時,可以會出現(xiàn) clang 找不到基礎(chǔ)運(yùn)行庫的問題。需要使用 Visual Studio 提供的運(yùn)行時,使用 VC 環(huán)境腳本可以提供環(huán)境配置。需要注意,PowerShell 沒有 @call 這個指令。使用 cmd /k 調(diào)用腳本后,不會保留環(huán)境配置信息。只能進(jìn)入 cmd 環(huán)境下執(zhí)行編譯命令。


當(dāng)然,可以使用 cmd /c 執(zhí)行環(huán)境配置腳本后,將配置信息通過 SET 指令打印出來,再使用 PowerShell 進(jìn)行二次處理,也可以實現(xiàn)一定的自動配置功能,但這已經(jīng)失去了方便使用的的原則。


這就需要使用開發(fā)環(huán)境提供的一個專用模塊 “Microsoft.VisualStudio.DevShell.dll”,用它來初始化 PowerShell VC 編譯環(huán)境??梢园惭b Windows Terminal 終端工具,方便運(yùn)行編譯環(huán)境。


命令行直接以新進(jìn)程方式運(yùn)行,如果要在 PowerShell 執(zhí)行,就需要使用反引號對參數(shù)中的雙引號進(jìn)行轉(zhuǎn)義。



以下是 Windows 系統(tǒng),Visual Studio 2019 社區(qū)版,MinGW-w64 GCC 12.2 以及 LLVM Clang 14,等三大編譯器的 Sublime 構(gòu)建配置參考,MSVC 部分放在下一節(jié)內(nèi)容:

Clang & GCC

## ==? MSVC & C++20

通過 Sublime 構(gòu)建工具調(diào)用 MSVC 編譯 C++20 程序,配置參考如下:

MSVC C++20 Modules
MSVC C++23

Visual Studio 2019 默認(rèn)沒有支持 C++20,也未完全支持模塊。編寫和使用自己的模塊通常效果很好,但導(dǎo)入標(biāo)準(zhǔn)庫標(biāo)頭就不能做到開箱即用。VS 2019 16.8 版本才開始支持 P1103R3 Modules。


首先,需要修改項目配置,啟用 C++20 規(guī)范或草案,使用右鍵菜單設(shè)置項目屬性:

- C/C++ ? Language ? C++ Language Standard?

? ? - ISO C++20 Standard (/std:c++20)?

? ? - Preview - Features from the Latest C++ Working Draft (/std:c++latest)

為了實現(xiàn)標(biāo)準(zhǔn)庫可以作為模塊導(dǎo)入,需要做一點標(biāo)頭單元的處理工作,將需要引用的標(biāo)準(zhǔn)庫統(tǒng)一放置在一個全局頭文件中,比如 HeaderUnits.h,它包含所有標(biāo)準(zhǔn)庫的導(dǎo)入:

Visual Studio 2019 項目的解決方案瀏覽器中,執(zhí)行以下操作,通過右鍵設(shè)置 HeaderUnits.h 屬性,在 Configuration Properties 面板中按以下步驟設(shè)置:

- General ? Item Type? ?? C/C++ Compiler 設(shè)置好并應(yīng)用設(shè)置;

- C/C++ ? Advanced ?

? ? - Compile as C++ Header Unit (/exportHeader)

? ? - Compile as C++ Module Internal Partition (/internalPartition)

經(jīng)過以上設(shè)置,MSBuild 工程文件中會有相應(yīng)更新:

如果沒出現(xiàn)相應(yīng)的 C++ Header Unit 高級主編譯選項,那么就需要更新到最新版本。標(biāo)頭單元編譯功能需要 Visual Studio 2019 version 16.10 以上版本支持,MSVC 編譯器版本號為 19.29。


然后,重新編譯項目,/exportHeader (Create header units) 選項會讓編譯器生成標(biāo)頭單元文件。編譯器會為標(biāo)頭單元生成相應(yīng)的 IFC (.ifc) 文件,這里生成的是 HeaderUnits.h.ifc。


標(biāo)頭單元**header unit**是頭文件的二進(jìn)制表示,MSVC 使用 .ifc 擴(kuò)展名表示標(biāo)頭單元文件,以及編譯好的命名模塊 (.ixx, .cppm, .h, .hpp)。


如果使用模塊實現(xiàn)分區(qū),也稱為內(nèi)部分區(qū) Module Internal Partition,可以設(shè)置 /internalPartition。


編譯生成成標(biāo)頭單元文件后,使用 /headerUnit 來引用它,將標(biāo)頭單元文件與頭文件關(guān)聯(lián)起來:

后綴 quote 和 angle 分別表示查找已編譯的標(biāo)頭單元文件的兩種規(guī)則,分別是按 `#include "file"` 和 `#include <file>` 一樣的規(guī)則查找。沒有后綴則在當(dāng)前目錄下,或者按指定的 ifc 文件路徑查找。


MSVC 提供多個標(biāo)頭單元編譯方法:


01. Build a shared header unit project,使用一個靜態(tài)庫工程引用需要使用的標(biāo)頭單元,

? ? 這種方法可以更精細(xì)控制導(dǎo)入庫的標(biāo)頭單元。

? ? https://learn.microsoft.com/en-us/cpp/build/walkthrough-import-stl-header-units?view=msvc-160

02. 將單個頭文件編譯為標(biāo)頭單元,即上面介紹的操作方法,適用于少量頭文件的處理。

? ? https://learn.microsoft.com/en-us/cpp/build/walkthrough-header-units?view=msvc-160#approach1

03. Automatically scan for and build header units. 自動掃描頭文件并編譯標(biāo)頭單元,需要

? ? 對項目源代碼做描述。項目需要做如下配置:

? ? - All Configurations → C/C++ → General

? ? - → Scan Sources for Module Dependencies (YES)

? ? - → Translate Includes to Imports (/translateInclude)

? ? https://learn.microsoft.com/en-us/cpp/build/walkthrough-header-units?view=msvc-160#approach2

04. VS 2019 16.11 版本支持使用 /std:c++20 直接將 include 的頭文件編譯為標(biāo)頭單元而無需改動源代碼。


標(biāo)頭單元配置文件 header-units.json 有兩個目的:

- 在指定 /translateInclude 編譯選項時用來確定那些頭文件需要轉(zhuǎn)譯成標(biāo)頭單元。

- 最小化復(fù)制符號以提高編譯命令生成的吞吐量。


為了查看 Visual Studio 編譯過程的細(xì)節(jié)信息,可以打開選項設(shè)置為診斷輸出模式:

- Tools ? Options... ? Projects and Solutions ? Build And Run ??

? ? - MSBuild project build output verbosity ? Diagnostic


或者使用 msbuild 命令進(jìn)行構(gòu)建,:

? ? msbuild ..\msvc\demo.vcxproj -t:Rebuild -property:platform=x86

編譯標(biāo)頭單元的 MSVC 命令行就如以下那樣使用了非常復(fù)雜的、繁多的參數(shù),但是構(gòu)建一個標(biāo)頭單元配置文件需要使用 /sourceDependencies:directives 編譯指令,此指令需要在標(biāo)頭單元文件 .ifc 文件生成之前使用。


然后,再使用一個名稱類似的指令 /sourceDependencies,它會根據(jù)源代碼級別依賴,將標(biāo)準(zhǔn)庫頭文件編譯為標(biāo)頭單元,同時生成依賴信息文件,.ifc.d.json。


得到標(biāo)頭單元文件后,再使用 /headerUnit 指令將其與源頭文件或標(biāo)準(zhǔn)庫文件關(guān)聯(lián)起來,最后與程序源代碼編譯生成可執(zhí)行程序。



## ==? C++2023 模塊化參考資料


-? Bjarne Cxx HOPL4 paper - C++20:方向之爭](https://github.com/Cpp-Club/Cxx_HOPL4_zh/blob/main/09.md)

- [P1103R3 Merging Modules](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1103r3.pdf)

- [探索c++底層編譯原理](https://www.cnblogs.com/zhangshinan/p/12971792.html)

- [C/C++編譯構(gòu)建相關(guān)問題](https://www.cnblogs.com/hongyugao/p/15499494.html)

- [Support for C++20 Modules](https://www.jetbrains.com/help/clion/support-for-c-20-modules.html)

- [C++ 20 協(xié)程 concept ranges modules](https://www.bilibili.com/video/BV1kV411h78u/)

- [C++20 modules with GCC11](https://blog.feabhas.com/2021/08/c20-modules-with-gcc11/)

- [C++20 新特性: modules 及實現(xiàn)現(xiàn)狀](https://zhuanlan.zhihu.com/p/350136757)

- [Invoking GCC - 3.23 C++ Modules](https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Modules.html)

- [C++ Support in Clang](https://clang.llvm.org/cxx_status.html)

- [Clang 17 - Modules](https://clang.llvm.org/docs/Modules.html)

- [Clang 17 - Standard C++ Modules](https://clang.llvm.org/docs/StandardCPlusPlusModules.html)

- [Clang CLI reference](https://clang.llvm.org/docs/ClangCommandLineReference.html)


01. https://learn.microsoft.com/en-us/cpp/build/walkthrough-header-units

02. https://learn.microsoft.com/en-us/cpp/cpp/tutorial-import-stl-named-module

03. https://learn.microsoft.com/en-us/cpp/cpp/tutorial-named-modules-cpp

04. https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros

05. https://docs.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance

06. https://learn.microsoft.com/en-us/visualstudio/releases/2019/release-notes

07. [/exportHeader](https://learn.microsoft.com/en-us/cpp/build/reference/module-exportheader)

08. [/headerUnit](https://learn.microsoft.com/en-us/cpp/build/reference/headerunit)

09. [/headerName](https://learn.microsoft.com/en-us/cpp/build/reference/headername)

10. [Overview of modules in C++](https://learn.microsoft.com/en-us/cpp/cpp/modules-cpp)

11. [Visual C++ 中生成和導(dǎo)入標(biāo)頭單元](https://learn.microsoft.com/zh-cn/cpp/build/walkthrough-header-units)

12. [Microsoft C++ Docs](https://github.com/MicrosoftDocs/cpp-docs/)

13. [WSL](https://github.com/Microsoft/WSL/)

14. [Windows Console](https://github.com/Microsoft/Terminal/)

15. [Hyper-V](https://github.com/MicrosoftDocs/Virtualization-Documentation)

16. [Windows Terminal](https://github.com/Microsoft/Terminal/)

17. https://github.com/sirredbeard/Awesome-WSL



Hello World 能有什么難度?C++20 # C++ 23的評論 (共 條)

分享到微博請遵守國家法律
荥经县| 孟州市| 吴堡县| 红原县| 颍上县| 台南县| 乌审旗| 辽源市| 秦皇岛市| 额敏县| 朝阳区| 洛隆县| 平舆县| 永嘉县| 尼勒克县| 绥芬河市| 蓝田县| 虎林市| 明光市| 静宁县| 拜泉县| 东乡县| 沅陵县| 仲巴县| 泗水县| 昆明市| 乌鲁木齐县| 锡林郭勒盟| 伊宁市| 麻城市| 建始县| 香格里拉县| 武功县| 九龙坡区| 永平县| 珠海市| 开封县| 太仆寺旗| 平定县| 伊宁县| 司法|