導航:首頁 > 源碼編譯 > 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相關的資料

熱點內容
程序員站會 瀏覽:844
web轉行程序員 瀏覽:570
androidcameraopen 瀏覽:999
linuxphpredis安裝 瀏覽:846
如何讓伺服器接入區域網 瀏覽:776
專抓波段指標源碼 瀏覽:115
單門蚊帳加厚加密 瀏覽:949
程序員的專業能力 瀏覽:819
股票啟動源碼設置 瀏覽:81
如何給我的抖音號加密碼 瀏覽:96
海康4200怎麼增加存儲伺服器 瀏覽:992
安卓機清理內存app清什麼 瀏覽:221
股票源碼圖形 瀏覽:992
純牛奶可以用壓縮面膜 瀏覽:258
兩個文件夾的文件查重 瀏覽:947
三十七八的程序員 瀏覽:402
cli執行php 瀏覽:914
功放1db壓縮點 瀏覽:929
多通道收款源碼 瀏覽:582
androidedittext行數 瀏覽:267