C中如何调用C++函数?

上一篇 / 下一篇  2012-08-22 09:05:42 / 个人分类:C++

2ZOQ'[6x-Q?#n0ipp0  前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数用extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂拿来Mark一下。

0Yg Xt9EYj0

5Y:d$[i/DC%S}0  将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:

#TsPP/EY'`0

// C++ code:

T9NWH` G0

extern "C" void f(int);51Testing软件测试网Du7BWu~g

void f(int i)51Testing软件测试网1way2ll6X

{51Testing软件测试网&c3m@b [*b|pJ

    // ...51Testing软件测试网jG fXmr0C

}

OEb W\|3a0
51Testing软件测试网W^0E9R)X0I.\"f.[

  然后,你可以这样使用 f():

(N:w,`p Y5prp0

/* C code: */

A W2i?F0

void f(int);

7H:t,oi9DZ i6Gg7Lt0

void cc(int i)51Testing软件测试网~pSZ:l+O!B;]JG;^

{51Testing软件测试网#^FV`7vsSp

   f(i);51Testing软件测试网Y!l/Q j,tY

  /* ... */

U4CoCQjQ0

   }51Testing软件测试网$~0W3E8S\s

51Testing软件测试网-O!c)K&h9E

  当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:51Testing软件测试网J9o&D%j swm$xgL

// C++ code:

7\ ?r;s7Y_I!b0

class C

8D xvc3FXlND!p3^0

{51Testing软件测试网Y*B z8t5|6OkH:G0^ `O

      // ...51Testing软件测试网r H|D R)S'R D2Kr

      virtual double f(int);51Testing软件测试网 U:No*D5k@

};51Testing软件测试网9q3G{Y.A/N"I.MP;mX

 

YRS.@ aet0

extern "C" double call_C_f(C* p, int i) // wrapper function51Testing软件测试网PajZ(pW

{

!fw]2`nG!Lb0

      return p->f(i);

-C\^*^3d[0

}51Testing软件测试网uP,_]/oP`

*jx fl}8m,h%J0  然后,你就可以这样调用 C::f():

`~-zzsl+Bx8Gm0

/* C code: */51Testing软件测试网QwR A5Jh

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

Y$Q9EN'TtuAZ$eZ0

 

S/MDR-F U!qH0

void ccc(struct C* p, int i)51Testing软件测试网+T'z+m|VDps4Za

{

!v\;yvu;g5HOA1?0

      double d = call_C_f(p,i);51Testing软件测试网*YUV-lP;er*j'O

      /* ... */51Testing软件测试网D(]N n SJ Pi

}51Testing软件测试网0e'E d7qKj1bp

51Testing软件测试网nf \z*UG!l g

  如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:51Testing软件测试网I&Fu5` x}#u g

// C++ code:

w_ AQ;F0

void f(int);51Testing软件测试网W U&Y e {-FB8c(U

void f(double);51Testing软件测试网1XQlfS9p5@N$}7_

 

j4pC^ U l%o0

extern "C" void f_i(int i) { f(i); }51Testing软件测试网)OIO#WKke

extern "C" void f_d(double d) { f(d); }51Testing软件测试网Qv+j;TJ{

i"d H}'{z}?0  然后,你可以这样使用每个重载的 f():

*{#A.G)C]0

/* C code: */

,{P9Jn!r@ }0

void f_i(int);51Testing软件测试网N*o \&Ag0S3MgK"H z O

void f_d(double);

)[+H1LL X's6Do0

 51Testing软件测试网%Y{r*V4a

void cccc(int i,double d)

9m&?b7o{&c3{0

{51Testing软件测试网1`3V+k7B2? X7^ o

      f_i(i);51Testing软件测试网e&S_Q,|Y!^

      f_d(d);51Testing软件测试网/Jq6eF,Tx h6_V

      /* ... */

r_t ]oX0

}51Testing软件测试网1C6t;F%p)nCZ

51Testing软件测试网s JS'o5v W.IE l

  注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。

%ZKx0h"s0

TAG:

 

评分:0

我来说两句

Open Toolbar