最近做了一個wav格式的音頻播放器,界面部分用Qt實現,中間層代碼使用C語言實現,這就涉及到C和C++相互調用的問題。
C++調用C語言的方法在另一篇文章中已經說明(見 http://www.linuxidc.com/Linux/2016-11/137072.htm),C調用C++的方法現做如下介紹。
音頻播放的時候中間層代碼需要將音頻的播放進度和狀態等信息反饋給界面程序進行顯示,但是主程序是用c++寫的,通過接口函數調用c中間層代碼進行相應操作並完成相應的功能,因此中間層c代碼並不能主動將參數反饋給主線程,怎麼辦? 通過函數指針實現。
首先,在c代碼中聲明一個函數指針,和一個以函數指針類型為參數的接口函數。
void (*fset)(int value);
void finit( void (*f)(int value))
{
fset = f;
}當c++調用此函數時,將需要被c語言調用的函數 當作參數傳遞給c並賦值給全局函數指針,這樣在c中調用 fset(int value);就可以實現c++函數的功能。
但是,要想實現c語言修改c++類成員的功能,還需要將此函數聲明為友元
class A{
public:
A();
~A();
friend void set(int value);
}
A * pa; //聲明一個全局的A類對象
A::A(){
pa = this; //在A的構造函數中將this指針傳遞給pa
}
void set(int value){
pa->-------- //通過pa指針修改類成員屬性
}
最後,在Qt圖形界面相應控件下 調用c語言函數 void finit(void (*f)(int value )) 並把 set()友元函數當作參數傳遞給c語言
finit(set);
然後再c語言中調用 fset(value) 就可以將 value 傳遞給c++代碼處理
此方法雖然可以實現 c語言修改 c++類成員屬性的功能,但是破壞了類的封裝性,目前只知道在嵌入式產品開發中使用。