剖析extern "C"

env:
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)


在c++中調(diào)用c語言寫的模塊時經(jīng)常在頭文件中加入這樣一段預(yù)處理命令:

#ifdef __cplusplus
extern "C" {   
#endif
/*some c header or declaration*/
#ifdef __cplusplus
}
#endif

之所以要引入extern "C"(注: 引號中是大寫的C)缀棍, 是因為c++中存在overload即函數(shù)重載, 為了區(qū)別函數(shù)名相同參數(shù)不同的函數(shù), c++編譯器在編譯期間會將函數(shù)名和函數(shù)參數(shù)作為整體進行編譯來得到鏈接所需的符號;c語言中沒有overload, 編譯器直接以函數(shù)名作為鏈接符號, 無視函數(shù)名后面的參數(shù)膳帕。


請看以下例程:

例程一:

有以下2個模塊main.cc和add.c, 在main.cc中調(diào)用add.c中的函數(shù)add

/*main.cc模塊*/
#include <iostream>

//extern "C"
//{
  extern int add(int a, int b);
//}

int main(int argc, char * argv[])
{
  int s;
  
  s = add(1, 2); 
  std::cout << "s = " << s << std::endl;  

  return 0;
}
/*add.c模塊*/
int add(int a, int b)
{
  return a + b;
}

執(zhí)行以下命令:
g++ -c main.cc
gcc -c add.c
g++ main.o add.o -o test
則會報鏈接錯誤:
undefined reference to `add(int , int)', 意為找不到該函數(shù)定義。
執(zhí)行objdump -t main.o查看符號表發(fā)現(xiàn)main.cc中調(diào)用的外部函數(shù)add已被編譯為"00000000 UND 00000000 _Z3addii"(add后面的2個i為參數(shù)int, int 的縮寫), 明顯函數(shù)編譯后的鏈接符號與函數(shù)參數(shù)是有關(guān)系的。再執(zhí)行objdump -t add.o查看符號表發(fā)現(xiàn)add函數(shù)對應(yīng)的符號就是add。顯而易見鏈接器肯定找不到鏈接符號為_Z3addii的函數(shù), 因為我們從來沒有定義過。

試想: 其他模塊不動將add.c中的add函數(shù)改名為_Z3addii是否可以鏈接成功呢? 答案是肯定的牛隅, 但是這么寫代碼有啥意義呢?

例程二:

有以下2個模塊main.cc和add.c, 在main.cc中調(diào)用add.c中的函數(shù)add
將例程一中extern "C"的注釋打開, 如下所示:

/*main.cc模塊*/
#include <iostream>

extern "C"
{
  extern int add(int a, int b);
}

int main(int argc, char * argv[])
{
  int s;
  
  s = add(1, 2);
  std::cout << "s = " << s << std::endl;  

  return 0;
}
/*add.c模塊*/
int add(int a, int b)
{
  return a + b;
}

執(zhí)行以下命令:
g++ -c main.cc
gcc -c add.c
g++ main.o add.o -o test
編譯鏈接正常, 執(zhí)行可執(zhí)行文件./test, 即可看到我們想要的結(jié)果:s = 3。此刻我們再次執(zhí)行命令objdump -t main.o看到main.cc中的調(diào)用的外部函數(shù)add被編譯為:"UND 00000000 add", 符號和函數(shù)名完全一致而沒有添加一些奇怪的東西酌泰!

總結(jié):

? extern "C"就是要告訴c++編譯器大括號里面聲明的函數(shù)要按照c語言的方式編譯成鏈接需要的符號媒佣。這樣c++在鏈接的時候才能找到對應(yīng)的c函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陵刹,一起剝皮案震驚了整個濱河市丈攒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌授霸,老刑警劉巖巡验,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碘耳,居然都是意外死亡显设,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門辛辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捕捂,“玉大人,你說我怎么就攤上這事斗搞≈冈埽” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵僻焚,是天一觀的道長允悦。 經(jīng)常有香客問我,道長虑啤,這世上最難降的妖魔是什么隙弛? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮狞山,結(jié)果婚禮上全闷,老公的妹妹穿的比我還像新娘。我一直安慰自己萍启,他們只是感情好总珠,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勘纯,像睡著了一般局服。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屡律,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天腌逢,我揣著相機與錄音,去河邊找鬼超埋。 笑死搏讶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霍殴。 我是一名探鬼主播媒惕,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼来庭!你這毒婦竟也來了妒蔚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肴盏,沒想到半個月后科盛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡菜皂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年贞绵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恍飘。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡榨崩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出章母,到底是詐尸還是另有隱情母蛛,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布乳怎,位于F島的核電站彩郊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舞肆。R本人自食惡果不足惜焦辅,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椿胯。 院中可真熱鬧筷登,春花似錦、人聲如沸哩盲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廉油。三九已至惠险,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抒线,已是汗流浹背班巩。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘶炭,地道東北人抱慌。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像眨猎,于是被迫代替她去往敵國和親抑进。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

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

  • 一睡陪、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,818評論 0 27
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,701評論 0 3
  • 玟瑾/文 食客眾多、就餐需要排隊領(lǐng)號信殊、總在翻臺炬称,人們就會說這個飯館人氣十足,而當(dāng)一個人總表現(xiàn)出一些影響力鸡号、具有很強...
    我是玟瑾閱讀 629評論 0 1
  • 青春說起來好像是一個褒義詞转砖,仿佛它就該是絢爛的或難忘或,鲸伴,,好多詞可以形容它晋控,可我卻只想任性的只寫自己的青春汞窗。 我...
    微窨一世閱讀 188評論 5 0
  • 小時候,我們總是亦步亦趨的跟著父母赡译,唯恐做錯了事仲吏。上學(xué)后,模仿老師走路蝌焚、說話裹唆,因為覺得老師超級正確。工作了只洒,深知責(zé)...
    葉塞尼婭閱讀 562評論 0 0