C++基礎知識-編譯相關

記錄C++語言相關的基礎知識

1 C++源碼到可執行文件的四個階段

預處理(.i)、編譯(.s)、匯編(.obj)、鏈接。

1.1 預處理

預處理階段,主要完成宏替換、文件展開、注釋刪除、條件編譯展開、添加行號和文件名標識,輸出.i/.ii預處理文件。

  • 宏替換,對于使用#define定義的值直接進行文本替換
  • 文件展開,對于#include h文件,直接對包含的文件進行展開
  • 刪除注釋信息。保留#pragma 編譯器指令。
  • 根據條件編譯參數進行條件編譯的展開
  • 添加行號和文件名標識
    例如 g++ -E compiler_test.cc -o compiler.i -DUSER_DEBUG=ON , 可以指定只生成預處理后的文件。圖中省略了#include<stdio.h>即對應的預處理后文件內容。
    預處理

1.2 編譯

對預處理文件進行詞法、語法、語義分析和優化,產生對應的匯編代碼,是構建過程中最復雜的部分。編譯參數中-O選項就是在這一步生效的。
編譯

  • 詞法分析, 將源代碼通過掃描器分析出源代碼中的每一部分分別對應的類型是什么(tokens),例如數字、括號、運算符、賦值等。
  • 語法分析,根據tokens進行語法分析,生成語法樹(表達式組成的樹,運算優先級會在此時確定, 源代碼級別的優化也會在此時進行)。
  • 語義分析,編譯階段進行的是靜態語義分析,也就是檢查語法樹的類型是否匹配、進行類型轉換、表達式是否有意義,語法樹在這個階段會被標記上語義。
  • 中間語言生成, 在語法樹上對代碼直接進行優化比較困難, 源代碼優化器往往是把整個語法樹轉化成中間代碼(與運行環境無關)。中間代碼的出現將整個編譯過程分成了兩部分,前端部分將源代碼轉化成機器無關的中間代碼,后端部分將后端代碼轉化為目標機器代碼。
  • 目標代碼生成與優化,通過代碼生成器將中間語言轉化為匯編代碼,代碼優化器針對匯編代碼進行優化。
    g++ -S compiler.i -o compiler.s

1.3 匯編

將匯編代碼轉化為機器可以執行的指令,生成目標文件(.o, .obj)。這個過程就是匯編器對匯編語言的翻譯過程。
g++ -C compiler.s add.s -o compiler.o

1.4 鏈接

C++的每個源代碼是獨立編譯的,會存在不同的目標文件相互引用的情況,這個時候目標文件中的符號(變量、函數等)還沒有真實的地址(這個階段的地址取的是0),經過鏈接將不同的目標文件進行組合。主要是進行地址和空間分配、地址綁定、重定位, 將目標文件轉化為可執行文件。

2 模板為什么通常不是分開聲明和實現

關鍵一點是模板的實例化是要在編譯單元內看到了模板實例化定義,而編譯單元是每個cpp文件,如此一來在模板的cpp文件中,由于沒有使用到模板,所以在編譯模板時根本不會實例化。在其他cc文件中引用時,在鏈接階段就會報錯。而在模板cc文件中實現模板定義

template <typename T> T Add(const T &left, const T &right) {return left + right;
}
template int Add(const int&, const int&);

通常是不合適的,首先是不知道用戶到底會實例化什么類型,其次代碼很繁瑣,所以一般都是在h文件中聲明和實現。

3 常用的編譯工具

gcc/g++、 automake、cmake、bazel

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38431.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【UML用戶指南】-26-對高級行為建模-狀態圖

目錄 1、概念 2、組成結構 3、一般用法 4、常用建模技術 4.1、對反應型對象建模 一個狀態圖顯示了一個狀態機。在為對象的生命期建模中 活動圖展示的是跨過不同的對象從活動到活動的控制流 狀態圖展示的是單個對象內從狀態到狀態的控制流。 在UML中&#xff0c;用狀態圖…

tcpdump命令詳解及使用實例

1、抓所有網卡數據包&#xff0c;保存到指定路徑 tcpdump -i any -w /oemdata/123.pcap&一、tcpdump簡介 tcpdump可以將網絡中傳送的數據包完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾&#xff0c;并提供and、or、not等邏輯語句來去掉無用的信…

【Python】已解決:SyntaxError: positional argument follows keyword argument

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決&#xff1a;SyntaxError: positional argument follows keyword argument 一、分析問題背景 在Python編程中&#xff0c;當我們在調用函數時混合使用位置參數&#xff08;p…

RabbitMQ進階篇

文章目錄 發送者的可靠性生產者重試機制實現生產者確認 MQ的可靠性數據持久化交換機持久化隊列持久化消息持久化 Lazy Queue(可配置~)控制臺配置Lazy模式代碼配置Lazy模式更新已有隊列為lazy模式 消費者的可靠性消費者確認機制失敗重試機制失敗處理策略 業務冪等性唯一消息ID業…

西部智慧健身小程序+華為運動健康服務

1、 應用介紹 西部智慧健身小程序為用戶提供一站式全流程科學健身綜合服務。用戶通過登錄微信小程序&#xff0c;可享用健康篩查、運動風險評估、體質檢測評估、運動處方推送、個人運動數據監控與評估等公益服務。 2、 體驗介紹西部智慧健身小程序華為運動健康服務核心體驗如…

idea xml ctrl+/ 注釋格式不對齊

處理前 處理后 解決辦法 取消這兩個勾選

核方法總結(三)———核主成分(kernel PCA)學習筆記

一、核主成分 1.1 和PCA的區別 PCA &#xff08;主成分分析&#xff09;對應一個線性高斯模型&#xff08;參考書的第二章&#xff09;&#xff0c;其基本假設是數據由一個符合正態分布的隱變量通過一個線性映射得到&#xff0c;因此可很好描述符合高斯分布的數據。然而在很多實…

ViewBinding的使用(因為kotlin-android-extensions插件的淘汰)

書籍&#xff1a; 《第一行代碼 Android》第三版 開發環境&#xff1a; Android Studio Jellyfish | 2023.3.1 問題&#xff1a; 3.2.4在Activity中使用Toast章節中使用到了kotlin-android-extensions插件,但是該插件已經淘汰,根據網上了解,目前使用了新的技術VewBinding替…

UE4_材質_材質節點_DepthFade

一、DepthFade參數 DepthFade&#xff08;深度消退&#xff09;表達式用來隱藏半透明對象與不透明對象相交時出現的不美觀接縫。 項目說明屬性消退距離&#xff08;Fade Distance&#xff09;這是應該發生消退的全局空間距離。未連接 FadeDistance&#xff08;FadeDistance&a…

【數據分析“三劍客”】—— Pandas

Pandas Pandas 是基于NumPy的一種工具&#xff0c;該工具是為解決數據分析任務而創建的, Pandas提供了大量能使我們快速便捷地處理數據的函數和方法。Pandas與出色的 Jupyter工具包和其他庫相結合&#xff0c;Python中用于進行數據分析的環境在性能、生產率和協作能力方面都是…

光照老化試驗箱:材料耐久性的“時間加速器”

光照老化試驗箱&#xff1a;材料耐久性的“時間加速器”概述 光照老化試驗箱是一種模擬自然光照條件下材料老化過程的設備&#xff0c;廣泛應用于材料科學領域的耐久性能評估。通過模擬日光中的紫外線、熱輻射等環境因素&#xff0c;加速材料老化過程&#xff0c;以此來驗證材…

redhawk:tech file與lefdef layer name不匹配問題

我正在「拾陸樓」和朋友們討論有趣的話題&#xff0c;你?起來吧&#xff1f; 拾陸樓知識星球入口 一些工藝廠商給的redhawk tech file是加密的&#xff0c;讀完tech file再讀lef/def會報錯&#xff0c;根本不知道問題在哪&#xff0c;他們一般會搭配給一個layer map&#xff…

分解+降維+預測!多重創新!直接寫核心!EMD-KPCA-Transformer多變量時間序列光伏功率預測

分解降維預測&#xff01;多重創新&#xff01;直接寫核心&#xff01;EMD-KPCA-Transformer多變量時間序列光伏功率預測 目錄 分解降維預測&#xff01;多重創新&#xff01;直接寫核心&#xff01;EMD-KPCA-Transformer多變量時間序列光伏功率預測效果一覽基本介紹程序設計參…

【簡單講解神經網絡訓練中batch的作用】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

Maven依賴解析過程詳細講解

Maven依賴解析是一個遞歸的過程&#xff0c;涉及從項目的POM文件開始&#xff0c;逐步解析直接依賴和傳遞依賴。以下是詳細的解析過程&#xff1a; 讀取項目的POM文件&#xff1a; Maven首先讀取項目的POM文件 (pom.xml)&#xff0c;該文件定義了項目的直接依賴。 解析直接依賴…

STM32第十五課:LCD屏幕及應用

文章目錄 需求一、LCD顯示屏二、全屏圖片三、數據顯示1.顯示歡迎詞2.顯示溫濕度3.顯示當前時間 四、需求實現代碼 需求 1.在LCD屏上顯示一張全屏圖片。 2.在LCD屏上顯示當前時間&#xff0c;溫度&#xff0c;濕度。 一、LCD顯示屏 液晶顯示器&#xff0c;簡稱 LCD(Liquid Cry…

node_sqlite3.node is not a valid win32 application

electron打包報錯 使用electron在linux平臺打包含有sqlite3的項目為win32應用時在運行階段&#xff0c;有時會遇到下面的錯誤 node_sqlite3.node is not a valid win32 application出現該錯誤的原因主要是在64bit的linux環境中&#xff0c;sqlite3默認build出來的二進制文件不…

【Windows】Visual Studio Installer下載緩慢解決辦法

【Windows】Visual Studio Installer下載緩慢解決辦法 1.背景2.分析3.結果 1.背景 使用visual studio在線安裝包進行IDE安裝&#xff0c;發現下載幾乎停滯&#xff0c;網速幾乎為零。 經過排查并不是因為實際網絡帶寬導致。 這里涉及DNS知識&#xff1b; DNS&#xff08;Dom…

消防認證-防火卷簾

一、消防認證 消防認證是指消防產品符合國家相關技術要求和標準&#xff0c;且通過了國家認證認可監督管理委員會審批&#xff0c;獲得消防認證資質的認證機構頒發的證書&#xff0c;消防產品具有完好的防火功能&#xff0c;是住房和城鄉建設領域驗收的重要指標。 二、認證依據…

TP8 JS(html2canvas) 把DIV內容生成二維碼并與背景圖、文字組合生成分享海報

方法一&#xff1a;前端JS生成(推薦) 注意&#xff1a; 1.這個網頁只能截圖圖片效果代碼&#xff0c;其它任何html效果都不能有&#xff0c;不然截圖就不準確 2.如果要生成的圖片DIV內容中引用了第三個方的圖片&#xff0c;就是不使用同一個域名下的圖片&#xff0c;需要把后…