C 學習小記(C C 函式之間相互呼叫)

2021-06-14 05:41:56 字數 1076 閱讀 9418

有時我們會遇到以下問題。

我們想在c++檔案中呼叫定義在c檔案中的函式,或者說想在c檔案中呼叫在c++檔案中定義的函式。

如果我們只是簡單的呼叫,那麼編譯器是不會允許我們這麼做的,這是由於編譯器對於c和c++函式的處理機制的不同而造成的。

c語言定義的函式在經過編譯之後函式名的前面被加上了下劃線。

例如:main函式經過編譯後函式名就變成了 _main;

然而對於c++中定義的函式在編譯之後函式名被擴充套件,將函式的引數型別,名稱和函式名組成了乙個函式名。

例如:函式的函式名為api,在經過編譯之後,函式名變為了 ?api@@yamm@z,其中?後的api為函式名,@相當於"()",而在@之間的yamm表示函式的引數。

如果想要看到自己定義的函式經編譯器處理後的名稱,可以在vs下右鍵專案名-->屬性-->鏈結器,將其中的「生成對映檔案」以及「對映匯出」改為「是」,在「對映檔名「中輸入乙個以.map結尾的檔名;

重新編譯一下專案,會在專案所在的資料夾下看到.map檔案,開啟之後查詢相應的函式名即可。例如:

通過以上編譯器對於c和c++函式的處理機制,應該能夠看出為什麼相互呼叫彼此的函式行不通。

雖然定義和宣告的函式名相同,但是由於不是有同一種語言處理的,所以在編譯器的連線階段,編譯器會找不到對應函式名的函式。

解決方案:1.在c中呼叫c++函式,將c++函式的宣告放在 extern "c" 內部,這樣就告知了編譯器該c++函式按照c的方式編譯此函式。

2.在c++中呼叫c函式,看過windows標頭檔案原始碼的應該都見過如下形式:

#ifdef __cplusplus

extern "c" {

#endif ……

#ifdef __cplusplus

#endif

由於標準的api函式都是通過c函式實現的,所以在c的編譯環境下__cplusplus巨集就不會起作用,然而在c++環境中,因為定義了__cplusplus巨集,函式就會以c的格式處理函式名,這樣在c和c++中,被定義的函式都能夠被正確的使用的。

C C 之間的相互呼叫

c呼叫c 意思是 c檔案中呼叫.cpp檔案中的 c 呼叫c的意思是.cpp檔案中呼叫.c檔案中的 使用extern c 主要原因 主要用於在c 中呼叫的c函式的宣告,或c 中編譯的函式要在c中呼叫,也即是匯入c形式的函式庫或者提供c型別的庫給c呼叫,因為在c 出現以前,很多 都是c語言寫的,而且很底...

C與C 之間相互呼叫

c與c 之間相互呼叫 1 匯出c函式以用於c或c 的專案 如果使用c語言編寫的dll,希望從中匯出函式給c或c 的模組訪問,則應使用 cplusplus 預處理器巨集確定正在編譯的語言。如果是從c 語言模組使用,則用c鏈結宣告這些函式。如果使用此技術並為dll提供標頭檔案,則這些函式可以原封不動地由...

C與C 之間相互呼叫

1 匯出c函式以用於c或c 的專案 如果使用c語言編寫的dll,希望從中匯出函式給c或c 的模組訪問,則應使用 cplusplus 預處理器巨集確定正在編譯的語言。如果是從c 語言模組使用,則用c鏈結宣告這些函式。如果使用此技術並為dll提供標頭檔案,則這些函式可以原封不動地由c和c 模組使用。以下...