c中如何調用c++函數?
前陣子被問及一個在c中如何調用c++函數的問題,當時簡單回答是将函數用extern "c"聲明,當被問及如何将類内成員函數聲明時,一時語塞,後來網上查了下,網上有一翻譯c++之父的文章可以作為解答,遂拿來mark一下。
将 c++ 函數聲明為``extern "c"''(在你的 c++ 代碼裡做這個聲明),然後調用它(在你的 c 或者 c++ 代碼裡調用)。例如:
// c++ code:
extern "c" void f(int);
void f(int i)
{
// ...
}
然後,你可以這樣使用 f():
/* c code: */
void f(int);
void cc(int i)
f(i);
/* ... */
}
當然,這招隻适用于非成員函數。如果你想要在 c 裡調用成員函數(包括虛函數),則需要提供一個簡單的包裝(wrapper)。例如:
class c
// ...
virtual double f(int);
};
extern "c" double call_c_f(c* p, int i) // wrapper function
return p->f(i);
然後,你就可以這樣調用 c::f():
double call_c_f(struct c* p, int i);
void ccc(struct c* p, int i)
double d = call_c_f(p,i);
/* ... */
如果你想在 c 裡調用重載函數,則必須提供不同名字的包裝,這樣才能被 c 代碼調用。例如:
void f(double);
extern "c" void f_i(int i) { f(i); }
extern "c" void f_d(double d) { f(d); }
然後,你可以這樣使用每個重載的 f():
void f_i(int);
void f_d(double);
void cccc(int i,double d)
f_i(i);
f_d(d);
注意,這些技巧也适用于在 c 裡調用 c++ 類庫,即使你不能(或者不想)修改 c++ 頭檔案。