C中如何調(diào)用C++函數(shù)?

資源來自網(wǎng)絡(luò),感謝原創(chuàng)者
   
   前陣子被問及一個(gè)在C中如何調(diào)用C++函數(shù)的問題
,當(dāng)時(shí)簡單回答是將函數(shù)extern "C"聲明,當(dāng)被問及如何將類內(nèi)成員函數(shù)聲明時(shí),一時(shí)語塞,后來網(wǎng)上查了下,網(wǎng)上有一翻譯C++之父的文章可以作為解答,遂拿來Mark一下。

C++ 函數(shù)聲明為``extern "C"''(在你的 C++ 代碼里做這個(gè)聲明),然后調(diào)用它(在你的 C 或者 C++ 代碼里調(diào)用)。例如:

// C++ code:

extern "C" void f(int);

void f(int i)

{

     // ...

}

然后,你可以這樣使用 f()

/* C code: */

void f(int);

void cc(int i)

{

    f(i);

   /* ... */

   }

當(dāng)然,這招只適用于非成員函數(shù)。如果你想要在 C 里調(diào)用成員函數(shù)(包括虛函數(shù)),則需要提供一個(gè)簡單的包裝(wrapper。例如:

// C++ code:

class C

{

  // ...

  virtual double f(int);

};

extern "C" double call_C_f(C* p, int i) // wrapper function

{

  return p->f(i);

}

然后,你就可以這樣調(diào)用 C::f()

/* C code: */

double call_C_f(struct C* p, int i);

void ccc(struct C* p, int i)

{

  double d = call_C_f(p,i);

  /* ... */

}

如果你想在 C 里調(diào)用重載函數(shù),則必須提供不同名字的包裝,這樣才能被 C 代碼調(diào)用。例如:

// C++ code:

void f(int);

void f(double);

extern "C" void f_i(int i) { f(i); }

extern "C" void f_d(double d) { f(d); }

然后,你可以這樣使用每個(gè)重載的 f()

/* C code: */

void f_i(int);

void f_d(double);

void cccc(int i,double d)

{

  f_i(i);

  f_d(d);

  /* ... */

}

注意,這些技巧也適用于在 C 里調(diào)用 C++ 類庫,即使你不能(或者不想)修改 C++ 頭文件

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>資源來自網(wǎng)絡(luò),感謝原創(chuàng)者