天天看點

【C/C++開發】C中調用C++函數

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++ 頭檔案。

繼續閱讀