最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++20 Modules模塊的使用小結(jié)

 更新時間:2026年06月30日 08:58:40   作者:碼云數(shù)智-園園  
本文主要介紹了C++20 Modules模塊的使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

C++ 開發(fā)者等這一天,等了三十年。

C++20 正式引入 Modules(模塊),這不是給頭文件換個皮,而是徹底重構(gòu)了 C++ 的編譯模型。傳統(tǒng) #include 的文本復(fù)制機制終于要被送進歷史博物館了。

一、頭文件機制的四宗罪

傳統(tǒng) C++ 靠 .h + .cpp 組織代碼,看似清晰,實則暗瘡密布:

痛點表現(xiàn)
編譯慢每次 #include 都重新解析整份頭文件,百萬行項目編譯時間呈 O(n²) 增長
宏污染#define MAX 100 可能讓你的 min() 函數(shù)靜默崩潰,排查如同大海撈針
循環(huán)包含A.h 包含 B.h,B.h 又包含 A.h —— 無限套娃,#pragma once 只是創(chuàng)可貼
命名沖突不同頭文件定義同名函數(shù)/宏,命名空間也救不了全局污染

預(yù)編譯頭文件(PCH)能緩解,但不夠靈活、不可移植、維護成本高。Modules 才是真正的解藥。

二、Modules 的核心機制:二進制接口緩存(BMI)

Modules 的本質(zhì)是:聲明不再靠復(fù)制粘貼進每個翻譯單元,而是由編譯器統(tǒng)一導(dǎo)出、導(dǎo)入二進制接口(BMI)。

傳統(tǒng)方式:#include → 文本復(fù)制 → 預(yù)處理器展開 → 每次重新編譯
Modules 方式:import → 加載已編譯的 BMI → 直接復(fù)用,零重復(fù)解析

這意味著:

  • import 不展開宏、不污染全局命名空間、不重復(fù)解析模板聲明
  • 模塊只編譯一次,后續(xù)所有導(dǎo)入直接引用緩存結(jié)果
  • 編譯時間從 O(n²) 優(yōu)化到接近 O(n),實測大型項目編譯提速 40%~50% 以上

三、語法:export + import,就這么簡單

3.1 定義模塊接口(.ixx 或 .cppm)

// math.ixx
export module math;
export int add(int a, int b) {
    return a + b;
}
export int multiply(int a, int b) {
    return a * b;
}
// 未導(dǎo)出的內(nèi)容,外部完全不可見
static int helper(int x) { return x * 2; }  // 模塊內(nèi)私有

?? export module math; 必須是文件第一行非空非注釋行,前面哪怕一個空行,Clang 就報錯。

3.2 分離實現(xiàn)(可選)

// math_impl.cpp
module math;
int add(int a, int b) {
    return a + b;
}

3.3 使用模塊

// main.cpp
import math;
#include <iostream>
int main() {
    std::cout << add(3, 4) << std::endl;       // ? 可用
    std::cout << multiply(3, 4) << std::endl;  // ? 可用
    // helper();  // ? 編譯錯誤:不可見
}

不需要 #include "math.h",不需要任何頭文件。

四、模塊分區(qū):大型項目的殺手級特性

C++20 支持將模塊拆分為子單元(Module Partitions),便于管理:

// math_core.ixx
export module math:core;
export int add(int a, int b) { return a + b; }
// math_extra.ixx
export module math:extra;
export import :core;  // 導(dǎo)入子分區(qū)
export int square(int x) { return x * x; }
// math.ixx(主模塊)
export module math;
export import :core;
export import :extra;

主模塊 math 統(tǒng)一 re-export 所有分區(qū),使用者只需 import math; 即可。

五、編譯命令:各編譯器差異

編譯器版本要求編譯命令
MSVCVS 2019 16.8+cl /std:c++20 /experimental:module math.ixx main.cpp
Clang13+clang++ -std=c++20 -fmodules math.ixx main.cpp
GCC11+(實驗性)g++ -std=c++20 -fmodules-ts math.ixx main.cpp

Clang 需兩步:先 clang++ -std=c++20 -fmodules -x c++-system-header vector 預(yù)編譯標準頭,再編譯主文件。

六、標準庫模塊:C++23 的大殺器

C++23 擴展支持 import std; 或 import <vector>;,但目前各編譯器實現(xiàn)差異大:

import std.core;  // C++23
import <vector>;  // 部分編譯器支持

典型坑:import <vector> 編譯通過,鏈接時報 undefined reference —— 說明 BMI 與鏈接時的庫 ABI 不匹配。Clang 下必須配合 -stdlib=libc++ 使用。

建議:別從 std 開始試,先寫自己的模塊。

七、踩坑指南:這些錯誤你一定會遇到

錯誤現(xiàn)象原因解決方案
import std; 報 "module not found"標準庫模塊未預(yù)編譯先用自己的模塊練手
export template<typename T> void foo() {...} 警告不能導(dǎo)出未實例化的模板定義只導(dǎo)出聲明,實現(xiàn)放模塊內(nèi)部
鏈接時報 ODR 違規(guī)跨模塊特化模板時定義不在同一單元特化聲明和定義必須在同一模塊
移動文件后 BMI 失效BMI 包含絕對路徑和編譯器哈希清理編譯緩存重新構(gòu)建
#include 出現(xiàn)在 .ixx 中模塊接口單元禁止包含頭文件用 import 替代 #include

八、什么時候該用 Modules?

場景建議
新項目強烈推薦直接用 Modules,別回頭
內(nèi)部工具庫優(yōu)先封裝(數(shù)學(xué)庫、字符串工具等),收益立竿見影
大型遺留項目逐步遷移高頻頭文件,別一次性全改
標準庫暫時別碰,等 C++23 生態(tài)成熟

CMake 3.28+ 已支持 target_compile_features(... PRIVATE cxx_modules) 和 add_module(),構(gòu)建系統(tǒng)正在跟上。

九、一句話總結(jié)

Modules 不是讓 #include 換個寫法,而是讓"包含"這個動作本身消失。

它用二進制接口緩存替代文本復(fù)制,用顯式導(dǎo)入替代隱式依賴,用編譯期契約替代預(yù)處理器魔術(shù)。編譯速度從平方級降到線性級,命名沖突和循環(huán)包含成為歷史名詞。

C++ 終于有了與 Python import、Go import、Rust mod 同級別的模塊系統(tǒng)。

頭文件的時代,結(jié)束了。

到此這篇關(guān)于C++20 Modules模塊的使用小結(jié)的文章就介紹到這了,更多相關(guān)C++20 Modules 模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中缺省參數(shù)的使用

    C++中缺省參數(shù)的使用

    C++缺省參數(shù)可在聲明或定義時設(shè)定默認值,調(diào)用時若未提供實參則自動使用,分為全缺省與半缺省,下面就來詳細的介紹一下缺省參數(shù)的使用,感興趣的可以了解一下
    2025-07-07
  • C++實現(xiàn)圖書館管理系統(tǒng)源碼

    C++實現(xiàn)圖書館管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖書館管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言中程序如何調(diào)用Python腳本

    C語言中程序如何調(diào)用Python腳本

    由于python有很多功能強大的開源庫,有時候在寫C語言程序的時候又想利用一下python強大的模塊,那么C語言中程序如何調(diào)用Python腳本,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C/C++實現(xiàn)的游戲角色名稱名字隨機生成代碼

    C/C++實現(xiàn)的游戲角色名稱名字隨機生成代碼

    這篇文章主要介紹了C/C++實現(xiàn)的游戲角色名稱名字隨機生成代碼,本文特別針對一些古典游戲的角色名稱進行隨機生成,需要的朋友可以參考下
    2015-05-05
  • C++20 新特性 協(xié)程 Coroutines(2)

    C++20 新特性 協(xié)程 Coroutines(2)

    上篇文章簡單給大介紹了 C++20 特性 協(xié)程 Coroutines co_yield 和 co_return 那么這篇文章繼續(xù)給大家介紹C++20 的新特性協(xié)程 Coroutines co_await,需要的朋友可以參考一下
    2021-10-10
  • C++實現(xiàn)AVL樹的示例詳解

    C++實現(xiàn)AVL樹的示例詳解

    AVL Tree 是一個「加上了額外平衡條件」的二叉搜索樹,其平衡條件的建立是為了確保整棵樹的深度為O(log_2N),本文主要介紹了AVL樹的實現(xiàn),需要的可以參考一下
    2023-03-03
  • C語言嵌入式實現(xiàn)支持浮點輸出的printf示例詳解

    C語言嵌入式實現(xiàn)支持浮點輸出的printf示例詳解

    這篇文章主要為大家介紹了C語言嵌入式實現(xiàn)支持浮點輸出的printf示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 探討++i與i++哪個效率更高

    探討++i與i++哪個效率更高

    i++總是要創(chuàng)建一個臨時對象,在退出函數(shù)時還要銷毀它,而且返回臨時對象的值時還會調(diào)用其拷貝構(gòu)造函數(shù)
    2013-10-10
  • VS2022連接sqlserver數(shù)據(jù)庫教程

    VS2022連接sqlserver數(shù)據(jù)庫教程

    本文主要介紹了VS2022連接sqlserver數(shù)據(jù)庫教程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C語言多種方法實現(xiàn)一個函數(shù)左旋字符串中K個字符

    C語言多種方法實現(xiàn)一個函數(shù)左旋字符串中K個字符

    這篇文章主要為大家介紹了C語言多種方法實現(xiàn)一個函數(shù),可以左旋字符串中K個字符,文中附含詳細的示例講解,有需要的朋友可以借鑒參考下
    2021-10-10

最新評論

同心县| 景谷| 镇雄县| 正宁县| 双峰县| 辽源市| 诸城市| 嫩江县| 吉木乃县| 武川县| 赣榆县| 衡水市| 达日县| 光泽县| 蓝田县| 通渭县| 确山县| 浦城县| 筠连县| 灌南县| 阿克陶县| 宁南县| 海林市| 澎湖县| 灌阳县| 宜兴市| 滨州市| 涿鹿县| 新化县| 河源市| 浠水县| 环江| 抚顺县| 改则县| 乌兰浩特市| 常宁市| 会同县| 山东| 延庆县| 保定市| 慈溪市|