關於swift,OC,C 混合程式設計(一)

2021-07-08 19:47:19 字數 1512 閱讀 5456

在寫cocos2dx引擎遊戲時,試驗了一下swift和c++的混編,swift可以與oc混編,c++可以和oc混編,那麼是不是c++也可以呼叫swift的**呢?大家都知道,swift剛剛面世,還有很多問題存在,儘管相對於oc來說,swift語言更加簡便,但是同時問題也不少,所以我們藉此來**混編中具體會出現的問題

如題目所說,swift與c++混合程式設計,必定需要用oc作為乙個中間介面,來銜接這兩種語言。先簡述一下兩種混編的機制(swift與oc混編,oc與c++混編)​

swift和oc婚變機制:因為swift​沒有標頭檔案,swift的呼叫都是依靠直接獲取,而非標頭檔案引用,所以它們混合程式設計的具體實現就是:swift需要橋接檔案,將oc標頭檔案引入其內部,用以swift呼叫oc**。oc則需要通過-swift.h檔案來宣告swift中類的標頭檔案定義,用以oc呼叫swift**。

oc和c++混編的機制:oc和c++混編要求就是通過互相引用標頭檔案來實現相互**的呼叫,唯一要求是——若是c++引用oc**,那麼oc標頭檔案內不能有任何oc的**

貌似通過以上兩種機制,我們可以設想——以oc作為媒介,我們似乎就可以實現關於c++和swift的混編了。

然而事實上並非這麼簡單,因為在實驗過程中,可以發現,會出現很多編譯類的報錯,同時會出現很多問題。問題的原因就在於oc和c++混編機制,oc標頭檔案內不能存有任何oc**。大家可能會覺得這個對於混合程式設計並沒有太大的影響,但是在實驗中就發現,在swift和oc進行資料傳輸的時候,混編就會出現乏力的現象

在此,我舉乙個例子來說明一下:

我們設定:class coffee//用以儲存咖啡的資訊,包括name area等資料(swift實現)

class coffeeinfo//用以上層獲取咖啡的資訊(swift實現)

很簡單,我們只要設定class coffee這個類,在內部宣告 name,area等變數即可。同時我們在classcoffeeinfo中新增funcgetcoffeeinfo(name:string)->coffee即可通過getcoffeeinfo獲取到咖啡資訊並返回

這樣看起來很容易,接下來我們嘗試新增oc介面來嘗試一下用oc呼叫swift

我們繼續設定:oc_getcoffeeinfo​.h和oc_getcoffeeinfo​.mm

oc_getcoffeeinfo​.mm中我們可以寫如下內容:

​#include "***-swift.h"

coffee coffeeinfo_get(char*name)

接下來我們來寫.h檔案:

#include "***-swift.h"

coffee coffeeinfo_get(char* name);

寫完標頭檔案我們就會發現問題,如果我們oc作為介面,那麼oc的標頭檔案內就不應該有oc的相關**,否則c++無法直接呼叫oc的**,但是我們又有相關的資料傳輸,那我們怎麼能不引入coffee標頭檔案返回他呢?所以必須引入-swift.h檔案,此時卻因為標頭檔案內有oc標頭檔案引用而顯示此標頭檔案不能被編譯。。。這就造成了關於混編的尷尬局面

如何解決這個問題呢?這裡我通過運用vo/po包的機制來解決了資料傳輸的具體問題

c python混合程式設計(一)

方法一 通過c api介面 參考 總結 這種方法可以實現簡單的python的 函式 類的呼叫,但是當 工程較大時,比如乙個demo.py 中匯入了多個模組,如下所示,deep sort資料夾下的 均為自己編寫,這種情況下在c 下呼叫python 的時候就會出現from deep sort impor...

C C 混合程式設計

c中呼叫c c 中呼叫c都會用到extern c 但兩者的意義卻大不一樣!例 c void foo int x c c code extern c void foo int x 讓c 聯結器能通過過類似於 foo來查詢此函式,而非類似於 foo int這樣的符號。使用extern c 則是告訴編譯器...

( ) ( )混合程式設計例項

混合程式設計例項 首先,開啟vc,然後新建乙個win32 dynamic link library工程,然後在出現的工程型別中選擇預設的空專案 a empty dll project 即不包含任何檔案的工程 然後結束嚮導。手動新增兩個檔案,乙個 c source file 乙個 text file ...