C語言和C 區別 C和C 之間互相呼叫

2021-08-09 23:03:45 字數 2711 閱讀 1175

為了描述清楚c和c++之間區別,

我們先建立兩個原始檔.c和.cpp

.c檔案:

.cpp檔案:

執行出來結果如圖:

會出現錯誤,無法解析的外部符號,在main中引用

為什麼呢?因為在.cpp檔案中,sum函式宣告是對函式的引用,生成的符號是「und」的,

產生的符號是sum_int_int的,

在.c檔案中,sum是在.text段,生成的符號是sum,兩個符號不同,

在c++裡面呼叫c的介面,由於符號不同,我們給函式外面加了extern "c",如下:

此時,執行成功。

再來看,下面圖中.c和.cpp檔案中**如圖所示:

既然有extern "c"可以實現c++呼叫c語言,那麼我們有些人可能會想那有沒有extern "c++"之類可以實現c語言呼叫c++呢?答案是否定的!為什麼呢?我們都知道c語言比c++出來的早,一般都是後者要相容前者的,所以就不會有extern "c++"之類的。

既然extern 只能在c++中使用,那麼如何實現c語言呼叫c++呢?我們可以通過下面的方法實現,即在.cpp檔案中源**直接包含在extern "c"裡面,這樣一來.cpp是按照c++的這樣就可以了。如圖:

我們經常可以看到類似於下面這樣的**,這種寫法是什麼意思呢?如果沒有這個巨集意味著你是用c語言編譯器編寫,**本身就是c語言所以沒有影響,如果你是用c++編譯器編寫的,也就意味著有這個巨集,有這個巨集的話,它就會展開extern "c",生成的符號還是c語言的符號,這段**可以保證,不管你用c還是c++編譯器去編譯,生成的都是c語言的符號,

於是又有乙個問題出現了,如果是在公司裡的話,你要用別人的函式,一般別人是不會給你源**的,只會給你提供介面,所以上面的c呼叫c++這種寫法一點都不現實。

我們一般寫**的時候會包含標頭檔案:#include ,裡面會呼叫printf和scanf等函式,這些函式在#include 裡面只有宣告,那麼,它們的定義在**呢?定義在libc.so裡面,這是動態鏈結庫,在執行的時候鏈結。

那麼靜態鏈結和動態鏈結的區別是什麼?

靜態鏈結就是兩步,

在windows下靜態鏈結一般都是鏈結的 *.lib ,動態鏈結鏈結的是*.dll

在linux下靜態鏈結都是鏈結的*.a,動態鏈結都是鏈結的*.so

靜態鏈結都是在編譯的時候鏈結,也就是在可執行檔案之前進行鏈結,所以在靜態鏈結的時候可執行檔案沒有生成,靜態鏈結完了,可執行檔案才生成。

靜態庫裡面提供了很多函式的定義,比如printf,scanf,puts,gets,等,你只用了puts就生成你的可執行檔案,但是其他函式的定義還是存在於你的**中的,佔可執行檔案的大小。

動態鏈結不一樣,是在執行了之後才鏈結,動態鏈結的時候,可執行檔案已經生成並且執行了,

動態鏈結的好處就顯而易見了,動態庫裡面有很多函式,你用到哪個才會鏈結到哪個,不用的話,那些函式的**段就不會占用你的可執行檔案的大小。好處就是減少可執行檔案的大小,缺點是:在執行的時候進行鏈結沒有靜態鏈結快。因為靜態鏈結在執行之前就已經鏈結好了,執行的時候直接執行就好了,當然,動態鏈結更主要的是在各個程序之間進行資料共享。

一般我們給別人**,都是給*。h和*.so,標頭檔案裡面只有函式的宣告,庫裡面才是函式真正的定義,庫裡面的東西你是改不了的。

那麼,就是下面這幅圖中,c++呼叫c語言該如何做呢?

這種呢,是很方便的,也就是c++呼叫c語言是很方便的,直接在宣告處extern "c"就好了,

如果庫裡面有很多函式需要呼叫,直接這麼寫就好了,能不能看到c的源**並不重要。

那麼,反過來,c呼叫c++就不一樣了(如下圖),為什麼不一樣呢?剛才是把c++裡面的**括到extern "c"裡面,現在你根本看不到c++裡面的源**,所以括不了。

那麼當c++以庫的形式提供**的時候,c該如何呼叫c++呢?

《程式設計師的自我修養—鏈結、裝載與庫》文中有一句話這麼說「電腦科學領域的任何問題都可以通過增加乙個間接的中間層來解決」,於是,我們遇到的這個問題便可以通過增加乙個中間檔案來實現。

如下圖:

通過中間檔案,把c++封裝成c語言的介面,就可以呼叫了。

C語言和C 的區別

c和c 的關係 就像是win98跟winxp的關係。c 是在c的基礎上增加了新的理論,玩出了新的花樣。所以叫c加加。c和c 的區別 c是乙個結構化語言,它的重點在於演算法和資料結構。c程式的設計首要考慮的是如何通過乙個過程,對輸入 或環境條件 進行運算處理得到輸出 或實現過程 事務 控制 c 首要考...

C語言和C 的區別

c 是c發展來的!c 是物件導向的語言,而c是結構化的語言!c的所有 在c 上都能應用,而c 的 在c上不能應用!c 是功能更強大的c!c語言與vc 的區別有很多 1,全新的程式程式思維,c語言是面向過程的,而vc 是物件導向的。2,c語言有標準的函式庫,它們鬆散的,只是把功能相同的函式放在乙個標頭...

C語言和C 的區別

1.字尾不同 2.關鍵字不同 c語言 c99有32個關鍵字 c c 98有63個關鍵字 3.c 面向過程 c 基於物件導向 面向過程與物件導向的區別?1 面向過程 c語言 eat 蛋炒飯 把所有要做的放在一起,無法做到飯與菜的分離,如果想改變菜會造成浪費 舉個例子 開車走在c中這麼想的,先分為幾步 ...