C和C 混合程式設計

2021-08-26 07:46:51 字數 1300 閱讀 1464

1

.#pragma once

關於#pragma once ,vc

++及g

++都支援,大膽的用吧。

匯出型別必須一致.要麼是c的,要麼是c++

2.__cplusplus

這個是必須的

#ifdef __cplusplus

extern

「c」 

#endif

c++中呼叫c的**

1、對於 c++ 中非類的成員函式,可以簡單的在函式宣告前面加 extern "c" ,通常函式宣告位於標頭檔案中,當然也可以將宣告和函式定義一起放在 cpp 中 ,在沒有宣告的情況下,直接在定義前新增 extern "c" 也可

2、對於 c++ 類的成員函式,則需要另外做乙個 cpp 檔案,將需要呼叫的函式進行包裝 。

要實現 c++ 中呼叫 c 的**,具體操作:

對於 c 中的函式**,要麼將 c **的標頭檔案進行修改,在其被含入 c++ **時在宣告中加入 extern "c" 或者在 c++ **中重新宣告一下 c 函式,重新宣告時新增上 extern "c" 頭 。

通過以上的說明,我明白一點,那就是加 extern "c" 頭一定是加在 c++ 的**檔案中才能起作用的 。

下面分析一下這個現象的實質原因:

c 編譯器編譯函式時不帶函式的型別資訊,只包含函式符號名字,如 c 編譯器把函式 int a(float x) 編譯成類似 _a 這樣的符號, c 聯結器只要找到了呼叫函式的符號,就可以連線成功,它假設引數型別資訊是正確的,這是 c 編譯聯結器的缺點。而 c++ 編譯器為了實現函式過載,編譯時會帶上函式的型別資訊,如他把上面的 a 函式可能編譯成 _a_float 這樣的符號為了實現過載,注意它還是沒有帶返回值得資訊,這也是為什麼 c++ 不支援採用函式返回值來區別函式過載的原因之一,當然,函式的使用者對函式返回值的處理方式(如忽略)也是重要原因。

基於以上,c 呼叫 c++ ,首先需要用封裝函式把對 c++ 的類等的呼叫封裝成 c 函式以便 c 呼叫,於是 extern "c" 的作用是:讓編譯器知道這件事,然後以 c 語言的方式編譯和連線封裝函式 (通常是把封裝函式用 c++ 編譯器按 c++ 方式編譯,用了 extern "c" 後,編譯器便依 c 的方式編譯封裝介面,當然介面函式裡面的 c++ 語法還是按 c++ 方式編譯;對於 c 語言部分 -- 呼叫者,還是按 c 語言編譯;分別對 c++ 介面部分和 c 部分編譯後,再連線就可以實現 c 呼叫 c++ 了 )。相反 ,c++ 呼叫 c 函式, extern "c" 的作用是:讓 c++ 聯結器找呼叫函式的符號時採用 c 的方式 ,即使用 _a 而不是 _a_float 來找呼叫函式

**

C 和C 混合程式設計

由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1int ...

C 和C 混合程式設計

由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1 int...

C和C 混合程式設計

如何用c語言封裝 c 的類,在 c裡面使用 stm32 c與c 混合開發 在嵌入式領域,c和c 混合程式設計還是很常見的 一 c 呼叫c的函式 這個很簡單,把c檔案對應的 件,全部用extern c 包起來就是了 ifdef cplusplus extern c endif二 c呼叫c 的函式 1 ...