【ARM 嵌入式 編譯系列 4.2 -- GCC 鏈接規范 extern “C“ 介紹】

文章目錄

    • extern "C" 介紹
      • extern "C" 使用示例
      • 1.2.2 作用場景

上篇文章:ARM 嵌入式 編譯系列 4.1 – GCC 編譯屬性 likely與unlikely 學習
下篇文章:ARM 嵌入式 編譯系列 5 – GCC 內建函數 __builtin 介紹

extern “C” 介紹

extern “C” 是一種鏈接規范,它用于告訴C++編譯器按照C語言的方式來鏈接代碼。這個關鍵字主要用于在C++代碼中調用C語言的函數庫。

C++語言對函數進行了名字修飾(Name Mangling),也就是說,C++編譯器在編譯函數的時候會給函數的名字添加一些額外的信息,例如函數的參數類型和數量。這樣做的目的是為了支持函數的重載。然而,C語言不支持函數的重載,所以C編譯器不會對函數名進行修飾。

例如,函數 void fun(int, int),C++ 編譯后的可能是 _fun_int_int (不同編譯器可能不同,但都采用了類似的機制,用函數名和參數類型來命名編譯后的函數名);而 C 語言沒有類似的重載機制,一般是利用函數名來指明編譯后的函數名的,對應上面的函數可能會是 _fun 這樣的名字。

因此,如果你在C++代碼中直接調用C語言的函數庫,由于名稱修飾的差異,鏈接器將無法找到正確的函數。這時,你就需要使用extern "C"來告訴C++編譯器,這段代碼應當按照C語言的規則進行鏈接。

extern “C” 使用示例

以下是extern "C"的一個使用示例:

#ifdef __cplusplus 
extern "C" { 
#endif #include <your_c_library.h> #ifdef __cplusplus 
} 
#endif

在這個示例中,我們使用了預處理器指令#ifdef __cplusplus來檢查是否正在使用C++編譯器。如果是,就添加extern "C",這樣C++編譯器就會按照C語言的規則對your_c_library.h中的代碼進行鏈接。

1.2.2 作用場景

這個功能主要用在下面的情況:

  • C++代碼調用C語言代碼;
  • 在C++的頭文件中使用;
  • 在多個人協同開發時,可能有的人比較擅長C語言,而有的人擅長 C++,這樣的情況下也會有用到。

例如,如果模塊 B 要引用模塊A中定義的全局變量和函數時只需包含模塊A的頭文件即可。這樣模塊 B 中調用模塊A中的函數時,在編譯階段,模塊B雖然找不到該函數,但并不會報錯;它會在鏈接階段從模塊A編譯生成的目標代碼中找到該函數。
extern 對應的關鍵字是 staticstatic 表明變量或者函數只能在本模塊中使用,因此,被static修飾的變量或者函數不可能被 extern C 修飾。

上篇文章:ARM 嵌入式 編譯系列 4.1 – GCC 編譯屬性 likely與unlikely 學習
下篇文章:ARM 嵌入式 編譯系列 5 – GCC 內建函數 __builtin 介紹

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

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

相關文章

輕轍視覺引擎以多種AI算法工具,助力紡織行業斷線檢測智能識別

近年來&#xff0c;人工智能技術在各行各業的應用愈發廣泛&#xff0c;機器視覺作為人工智能的重要分支&#xff0c;成為當下的研究熱點。機器視覺技術的發展&#xff0c;大幅提升了工業、農業、醫療等領域的效率和精度。尤其在工業領域&#xff0c;隨著智能制造的進一步發展&a…

stringstream常見用法

目錄 構造函數 輸出字符串 修改和清空字符串 利用 stringstream 去除字符串空格 利用stringstream去除指定的字符 stringstream 數據庫 <sstream> 構造函數 創建一個對象&#xff0c;向對象輸入字符串&#xff1a; string x"abcdefg";stringstream s…

Zookeeper與Kafka

Zookeeper與Kafka 一、Zookeeper 概述1.Zookeeper 定義2.Zookeeper 工作機制3.Zookeeper 特點4.Zookeeper 數據結構5.Zookeeper 應用場景6.Zookeeper 選舉機制 二、部署 Zookeeper 集群1.準備 3 臺服務器做 Zookeeper 集群2.安裝 Zookeeper3.拷貝配置好的 Zookeeper 配置文件到…

【Java】 java | git | win系統重裝會給開發環境帶來哪些問題

一、概述 1、近期發現電腦用起來不絲滑了&#xff0c;文件夾操作卡頓&#xff0c;一陣操作還會藍屏 2、不能忍&#xff0c;整理排查 二、電腦情況 1、CPU&#xff1a; I5-9400F 2.9GHz 6核 2、內存&#xff1a; 32G 3、固態&#xff1a;256G 4、機械&#xff1a;1T 5、盤符使用…

二叉樹的講解

&#x1f493;博主個人主頁:不是笨小孩&#x1f440; ?專欄分類:數據結構與算法&#x1f440; 刷題專欄&#x1f440; C語言&#x1f440; &#x1f69a;代碼倉庫:笨小孩的代碼庫&#x1f440; ?社區&#xff1a;不是笨小孩&#x1f440; &#x1f339;歡迎大家三連關注&…

詳解C語言中的int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t

2023年8月8日&#xff0c;周二上午 目錄 為什么會產生int8_t、uint8_t等這類數據類型int8_t、uint8_t等這類數據類型有什么用頭文件int8_t、uint8_t等這類數據類型是怎么實現的 為什么會產生int8_t、uint8_t等這類數據類型 根本原因在于&#xff0c;C 語言標準只是規定了各個…

SQL | 匯總數據

9-匯總數據 9.1-聚集函數 在實際開發過程中&#xff0c;可能會遇到下面這些情況&#xff1a; 確定大于某個值的有多少行數據&#xff0c;比如游戲排行榜&#xff0c;查詢玩家排行多少名。 獲取表中某些行的和&#xff0c;比如雙十一當天&#xff0c;某個用戶總訂單價格是多少…

學習篇之React Fiber概念及原理

什么是React Fibber&#xff1f; React Fiber 是 React 框架的一種底層架構&#xff0c;為了改進 React 的渲染引擎&#xff0c;使其更加高效、靈活和可擴展。 傳統上&#xff0c;React 使用一種稱為堆棧調和遞歸算法來處理虛擬 DOM 的更新&#xff0c;這種方法在大型應用或者…

最強自動化測試框架Playwright(7)- 使用cookie避免重復登錄

playwright在稱為瀏覽器上下文的隔離環境中執行測試。這種隔離模型提高了可重復性&#xff0c;并防止了級聯測試失敗。測試可以加載現有的經過身份驗證的狀態。這消除了在每次測試中進行身份驗證的需要&#xff0c;并加快了測試執行速度。 每次測試前登錄 以下示例登錄到 Git…

談談什么是云計算?以及它的應用

作者&#xff1a;Insist-- 個人主頁&#xff1a;insist--個人主頁 作者會持續更新網絡知識和python基礎知識&#xff0c;期待你的關注 目錄 ?編輯 一、什么是云計算 二、云計算的優勢與劣勢&#xff1f; 1、云計算的優勢 ①提高資源利用率 ②提升效率 ③降低成本 2、云…

python編程基礎與案例集錦,python編程入門經典

大家好&#xff0c;本文將圍繞python編程基礎與案例集錦展開說明&#xff0c;python編程入門與案例詳解是一個很多人都想弄明白的事情&#xff0c;想搞清楚python入門程序例子需要先了解以下幾個事情。 【程序1】 題目&#xff1a;輸入一行字符&#xff0c;分別統計出其中英文字…

『CV學習筆記』Opencv和PIL Image以及base64編碼互相轉化

Opencv和PIL Image以及base64編碼互相轉化 文章目錄 一. opencv&PIL.Image&Skimage1.1. opencv-python讀取透明圖片(帶alpha通道)1.2. opencv、PIL.Image、Skimage讀取的彩色圖片維度區別1.3. opencv、PIL.Image轉換二. base64和cv2 imge互相轉換三. base64和PIL imge互…

射頻入門知識-混頻器-1

5.4混頻電路-視頻_嗶哩嗶哩_bilibili ???????

【算法題】螺旋矩陣II (求解n階Z形矩陣)

一、問題的提出 n階Z形矩陣的特點是按照之(Z)字形的方式排列元素。n階Z形矩陣是指矩陣的大小為nn&#xff0c;其中n為正整數。 題目描述 一個 n 行 n 列的螺旋(Z形)矩陣如圖1所示&#xff0c;觀察并找出填數規律。 圖1 7行7列和8行8列的螺旋(Z形)矩陣 現在給出矩陣大小 n&…

數據結構入門:棧

目錄 前言 1. 棧 1.1棧的概念及結構 1.2 棧的實現 1.2.1 棧的定義 1.2.2 棧的初始化 1.2.3 入棧 1.2.4 出棧 1.2.5 棧的元素個數 1.2.6 棧頂數據 1.2.7 棧的判空 2.棧的應用 2.1 題目一&#xff1a;括號匹配 2.1.1 思路 2.1.2 分析 2.1.3 題解 總結 前言 無論你是計算機科學專…

CVE漏洞復現-CVE-2021-22555 Linux Netfilter 權限提升漏洞

CVE-2021-22555 Linux Netfilter 權限提升漏洞 漏洞描述 近日&#xff0c;互聯網公開了Linux Netfilter權限提升漏洞的POC及EXP&#xff0c;相關CVE編號&#xff1a;CVE-2021-22555。該漏洞在kCTF中被用于攻擊kubernetes pod容器實現虛擬化逃逸&#xff0c;該漏洞已在Linux內…

用chatGPT從左右眼圖片生成點云數據

左右眼圖片 需求 需要將左右眼圖像利用視差生成三維點云數據 先問問chatGPT相關知識 進一步問有沒有現成的軟件 chatGPT提到了OpenCV&#xff0c;我們讓chatGPT用OpenCV寫一個程序來做這個事情 當然&#xff0c;代碼里面會有一些錯誤&#xff0c;chatGPT寫的代碼并不會做模…

Arduino驅動MQ2模擬煙霧傳感器(氣體傳感器篇)

目錄 1、傳感器特性 2、硬件原理圖 3、控制器和傳感器連線圖 4、驅動程序 MQ2氣體傳感器,可以很靈敏的檢測到空氣中的煙霧、液化氣、丁烷、丙烷、甲烷、酒精、氫氣等氣體,與Arduino結合使用,可以制作火災煙霧報警、液化氣、丁烷、丙烷、甲烷、酒精、氫氣氣體泄露報警等相…

面試題. 字符串壓縮

字符串壓縮。利用字符重復出現的次數&#xff0c;編寫一種方法&#xff0c;實現基本的字符串壓縮功能。比如&#xff0c;字符串aabcccccaaa會變為a2b1c5a3。若“壓縮”后的字符串沒有變短&#xff0c;則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母&#xff08;a…

【JavaEE進階】Spring 更簡單的讀取和存儲對象

文章目錄 一. 存儲Bean對象1. 配置掃描路徑2. 添加注解存儲 Bean 對象2.1 使用五大類注解存儲Bean2.2 為什么要有五大類注解&#xff1f;2.3 有關獲取Bean參數的命名規則 3. 使用方法注解儲存 Bean 對象3.1 方法注解儲存對象的用法3.2 Bean的重命名3.3 同?類型多個 Bean 報錯 …