解析extern "C" {}

前言

在一個(gè)xxx.mm文件中膀跌,看到如下類似代碼

#ifdef __cplusplus
extern "C" {
#endif
    void printInteger(int count);
#ifdef __cplusplus
}
#endif

預(yù)處理(Preprocess)

源代碼變?yōu)榭蓤?zhí)行文件時(shí)遭商,會(huì)經(jīng)歷四個(gè)過程,預(yù)處理捅伤、編譯劫流、匯編、鏈接丛忆,編譯階段結(jié)束生成匯編代碼祠汇,匯編階段結(jié)束生成可重定位目標(biāo)文件,鏈接階段結(jié)束就生成了可執(zhí)行文件蘸际。那么預(yù)處理階段做了哪些事呢?

  • 預(yù)處理階段做的事

    1.將頭文件插入源文件中
    2.替換宏定義
    3.去除注釋
    4.條件編譯

  • include 與import

多說一句題外話徒扶,通過#include 與 #import都可以將頭文件引入源文件中粮彤。但是#import 優(yōu)化了重復(fù)頭文件引入問題,即不會(huì)導(dǎo)致重復(fù)引用,可正常編譯导坟。如下面兩種情況: A屿良,B都引入了C,而D同時(shí)引入了A惫周,B尘惧,則D相同于引入兩次C;A引入了B递递,B引入了C喷橙,而D引入了A,又引入了C登舞。

但是在上述情況下使用 #inculde贰逾,則會(huì)發(fā)生重復(fù)引用的問題 ,編譯會(huì)報(bào)錯(cuò)。
還有循環(huán)依賴的問題菠秒,A引入了B疙剑,B又引入了A,測(cè)試了下Xcode 9.1 對(duì)循環(huán)依賴沒有警告践叠。當(dāng)然業(yè)界多用 @class類引用解除循環(huán)依賴言缤,并且邏輯上看,大部分情況下我們也只需要類文件引用禁灼,并不需要詳細(xì)了解其屬性及接口設(shè)置管挟。

  • 總結(jié)

上面基本解釋了#ifdef #endif 是條件編譯,直白翻譯過來就是 如果當(dāng)前文件是 C++源文件匾二,則執(zhí)行extern "C" {}哮独。注意源文件后綴是.mm,表示可使用C++ API察藐。

下面接著說extern "C" {}要做什么皮璧?

extern

我們應(yīng)該經(jīng)常使用extern修飾全局變量,表示該變量可以在其他模塊使用分飞,如:

A.h //聲明
extern int a;
A.m //定義
int a = 1;
B.m
#import <A.h>
//do something with a
  • 可以多處聲明悴务,一次賦值,不可以在聲明時(shí)賦值譬猫。
  • 聲明的數(shù)據(jù)類型與賦值時(shí)相同
  • 未賦值會(huì)報(bào)錯(cuò)讯檐,多次賦值也會(huì)報(bào)錯(cuò)。

extern "C" {block}指明對(duì)待block中的代碼染服,使用類C語言的編譯與鏈接機(jī)制别洪,但語法還是遵循C++的機(jī)制。核心還是C++與類C的混編問題柳刮。

C++與類C混編

我們項(xiàng)目中可能使用Objective-C挖垛,C++兩種語言編寫痒钝,但是不同語言的語法習(xí)慣、編譯和鏈接都是不同的痢毒。

  • 注釋掉extern "C"

查看.mm的匯編代碼 送矩,可以看到函數(shù)名是 __Z12printIntergeri,C++中有函數(shù)重載機(jī)制哪替,所以在編譯函數(shù)時(shí)有所不同栋荸。但是在其他類C文件中使用該函數(shù),則會(huì)報(bào)錯(cuò)凭舶,找不到該函數(shù)定義晌块。

  • 加入 extern "C"

再次.mm匯編代碼,函數(shù)名則是_printInterger库快,這樣則可以在其他類C文件中使用了摸袁。

參考

C++項(xiàng)目中的extern "C" {}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市义屏,隨后出現(xiàn)的幾起案子靠汁,更是在濱河造成了極大的恐慌,老刑警劉巖闽铐,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝶怔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡兄墅,警方通過查閱死者的電腦和手機(jī)踢星,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隙咸,“玉大人沐悦,你說我怎么就攤上這事∥宥剑” “怎么了藏否?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長充包。 經(jīng)常有香客問我副签,道長,這世上最難降的妖魔是什么基矮? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任淆储,我火速辦了婚禮,結(jié)果婚禮上家浇,老公的妹妹穿的比我還像新娘本砰。我一直安慰自己,他們只是感情好钢悲,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布点额。 她就那樣靜靜地躺著青团,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咖楣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天芦昔,我揣著相機(jī)與錄音诱贿,去河邊找鬼。 笑死咕缎,一個(gè)胖子當(dāng)著我的面吹牛珠十,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凭豪,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼焙蹭,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嫂伞?” 一聲冷哼從身側(cè)響起孔厉,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帖努,沒想到半個(gè)月后撰豺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拼余,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年污桦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匙监。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凡橱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亭姥,到底是詐尸還是另有隱情稼钩,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布致份,位于F島的核電站变抽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏氮块。R本人自食惡果不足惜绍载,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滔蝉。 院中可真熱鬧击儡,春花似錦、人聲如沸蝠引。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矫夯,卻和暖如春鸽疾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背训貌。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工制肮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人递沪。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓豺鼻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親款慨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子儒飒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容