導航:首頁 > 源碼編譯 > c編譯後為什麼要加extern

c編譯後為什麼要加extern

發布時間:2023-10-26 23:49:24

① c++在進行c編譯時,為什麼要聲明extent c

你要知道 有的時候 需要用c編譯的程序調用c++編譯的庫或者c++源碼裡面的函數和類,
但是c和c++對於函數的處理是不同的,
比如說c編譯函數的話,如void fun()處理後之後可能就是fun,
然而c++的話,可能會在前面加上很多修飾的前綴,就不是fun了,可能是什麼g_fun,
具體我也不清楚,
由於c和c++對函數的處理方式不同的話,你在c++寫函數要讓c語言可以調用,那麼就要加個東西表示要按c的方式編譯函數,這就是加個extern "c"了,在c++語言裡面使用c方式的函數,聲明的時候也要加上extern "c"告訴編譯器按c的方式去查找這個函數,否則的話可能會出現鏈接錯誤,

具體的詳細說明可以去查詢相關資料啊。。。c++ primer 4裡面的最後一章好像有點說明,講的簡單明了,可以去看看哦。。。

關於文件後綴名是c還是cpp的,在vc6和vs2008等下面都是 分別按照對應語言處理的,要讓編譯器只按照c語法處理的話,要把後綴改成.c的,否則默認情況.cpp的話,即使源碼裡面是純c的語法,還是會按照c++處理的,所以編譯方式還是c++的,就體現不出extern "c"的作用了,要想體現出作用的話,可以建立.c和.cpp的文件或者工程嘗試下。。。

② 在C++ 程序中調用被 C 編譯器編譯後的函數,為什麼要加 extern 「C」聲明

首先,作為extern是C/C++語言中表明函數和全局變數作用范圍(可見性)的關鍵字,
該關鍵字告訴編譯器,其聲明的函數和變數可以在本模塊或其它模塊中使用。

通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變數以關鍵字extern聲明。
例如,如果模塊B欲引用該模塊A中定義的全局變數和函數時只需包含模塊A的頭文件即可。
這樣,模塊B中調用模塊A中的函數時,在編譯階段,模塊B雖然找不到該函數,但是並不會報錯;
它會在連接階段中從模塊A編譯生成的目標代碼中找到此函數

extern"C"是連接申明(linkagedeclaration),
被extern"C"修飾的變數和函數是按照C語言方式編譯和連接的,

來看看C++中對類似C的函數是怎樣編譯的:
作為一種面向對象的語言,C++支持函數重載,而過程式語言C則不支持。
函數被C++編譯後在符號庫中的名字與c語言的不同。

例如,假設某個函數的原型為:
voidfoo(intx,inty);

該函數被C編譯器編譯後在符號庫中的名字為_foo,
而C++編譯器則會產生像_foo_int_int之類的名字
(不同的編譯器可能生成的名字不同,
但是都採用了相同的機制,生成的新名字稱為「mangledname」)。

_foo_int_int這樣的名字包含了函數名、函數參數數量及類型信息,
C++就是靠這種機制來實現函數重載的。

例如,在C++中,函數voidfoo(intx,inty)與voidfoo(intx,floaty)
編譯生成的符號是不相同的,後者為_foo_int_float。
同樣地,C++中的變數除支持局部變數外,還支持類成員變數和全局變數。

用戶所編寫程序的類成員變數可能與全局變數同名,我們以"."來區分。
而本質上,編譯器在進行編譯時,與函數的處理相似,
也為類中的變數取了一個獨一無二的名字,
這個名字與用戶程序中同名的全局變數名字不同。

本內容,引用自,裡面有更詳細的說明:
http://blog.csdn.net/ygm_linux/article/details/26626893

閱讀全文

與c編譯後為什麼要加extern相關的資料

熱點內容
android外文文獻翻譯 瀏覽:180
如何為雲終端伺服器安裝軟體6 瀏覽:88
如何查找加密的應用 瀏覽:160
谷歌伺服器無法直接打開怎麼辦 瀏覽:430
電腦如何用安卓導航 瀏覽:354
十年以上程序員買什麼車 瀏覽:5
怎麼讓任務欄中文件夾合並 瀏覽:947
阿里雲伺服器後台開放8888埠 瀏覽:842
湖南電信iptv升級伺服器地址 瀏覽:1002
27乘36簡便演算法 瀏覽:338
柱加密區在哪裡 瀏覽:862
庫卡機器人編程視頻 瀏覽:834
程序員初級證 瀏覽:39
聚類演算法的偽代碼 瀏覽:1002
生物信息文件夾 瀏覽:860
如何設置電腦上的伺服器 瀏覽:1001
25乘105用簡便演算法 瀏覽:930
浪潮伺服器怎麼修復系統 瀏覽:341
泰拉瑞亞全物品國外伺服器地址 瀏覽:448
qq加密傳輸密碼 瀏覽:102