軟考程序員輔導:c中如何調用c++函數
C中如何調用C++函數?
前陣子被問及一個在C中如何調用C++函數的問題,當時簡單回答是將函數用extern"C"聲明,當被問及如何將類內成員函數聲明時,一時語塞,后來網上查了下,網上有一翻譯C++之父的文章可以作為解答,遂拿來Mark一下。
將C++函數聲明為``extern"C"''(在你的C++代碼里做這個聲明),然后調用它(在你的C或者C++代碼里調用)。例如:
//C++code:
extern"C"voidf(int);
voidf(inti)
{
//…
}
然后,你可以這樣使用f():
/*Ccode:*/
voidf(int);
voidcc(inti)
{
f(i);
/*…*/
}
當然,這招只適用于非成員函數。如果你想要在C里調用成員函數(包括虛函數),則需要提供一個簡單的包裝(wrapper)。例如:
//C++code:
classC
{
//…
virtualdoublef(int);
};
extern"C"doublecall_C_f(C*p,inti)//wrapperfunction
{
returnp->f(i);
}
然后,你就可以這樣調用C::f():
/*Ccode:*/
doublecall_C_f(structC*p,inti);
voidccc(structC*p,inti)
{
doubled=call_C_f(p,i);
/*…*/
}
如果你想在C里調用重載函數,則必須提供不同名字的包裝,這樣才能被C代碼調用。例如:
//C++code:
voidf(int);
voidf(double);
extern"C"voidf_i(inti){f(i);}
extern"C"voidf_d(doubled){f(d);}
然后,你可以這樣使用每個重載的f():
/*Ccode:*/
voidf_i(int);
voidf_d(double);
voidcccc(inti,doubled)
{
f_i(i);
f_d(d);
/*…*/
}
注意,這些技巧也適用于在C里調用C++類庫,即使你不能(或者不想)修改C++頭文件。