C中如何调用C++函数?
上一篇 /
下一篇 2012-08-22 09:05:42
/ 个人分类:C++
2ZO Q'[6x-Q?#n0ipp0 前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数用extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂拿来Mark一下。
0Yg Xt9EYj05Y:d$[i/DC%S}0 将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:
#TsPP/EY'`0// C++ code: T9NWH`G0extern "C" void f(int);51Testing软件测试网Du7BWu~g void f(int i)51Testing软件测试网1way2ll6X {51Testing软件测试网&c3m@b[*b|pJ // ...51Testing软件测试网jGfXmr0C } OEbW\|3a0 |
51Testing软件测试网W^0E9R)X0I.\"f.[ 然后,你可以这样使用 f():
(N:w,`p
Y5prp0/* C code: */ A
W2i?F0void f(int); 7H:t,oi9DZ
i6Gg7Lt0void cc(int i)51Testing软件测试网~pSZ:l+O!B;]JG;^ {51Testing软件测试网#^FV`7vsSp f(i);51Testing软件测试网Y!l/Qj,tY /* ... */ U4CoCQjQ0 }51Testing软件测试网$~0W3E8S\s |
51Testing软件测试网-O!c)K&h9E 当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:51Testing软件测试网J9o&D%j swm$xgL
// C++ code: 7\
?r;s7Y_I!b0class C 8Dxvc3F XlND!p3^0{51Testing软件测试网Y*B
z8t5|6OkH:G0^ `O // ...51Testing软件测试网 r
H|DR)S'RD2Kr virtual double f(int);51Testing软件测试网U:No*D5k@ };51Testing软件测试网9q3G{Y.A/N"I.MP;mX YRS.@
aet0extern "C" double call_C_f(C* p, int i) // wrapper function51Testing软件测试网PajZ(pW { !fw]2`n G!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!qH0void ccc(struct C* p, int i)51Testing软件测试网+T'z+m|VDp s4Za { !v\;yvu;g5HOA1?0 double d = call_C_f(p,i);51Testing软件测试网*YUV-lP;er*j'O /* ... */51Testing软件测试网D(]N
n
SJPi }51Testing软件测试网0e'E
d7qKj1bp |
51Testing软件测试网nf \z*UG!l
g 如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:51Testing软件测试网I&Fu5` x}#u
g
// C++ code: w _AQ;F0void f(int);51Testing软件测试网WU&Ye {-FB8c(U void f(double);51Testing软件测试网1XQl fS9p5@N$}7_ j4pC^U l%o0extern "C" void f_i(int i) { f(i); }51Testing软件测试网)OIO#WKke extern "C" void f_d(double d) { f(d); }51Testing软件测试网Qv+j;T J{ |
i"d
H}'{z}?0 然后,你可以这样使用每个重载的 f():
*{#A.G)C]0/* C code: */ ,{P9Jn!r@}0void f_i(int);51Testing软件测试网N*o\&Ag0S3MgK"H z O void f_d(double); )[+H1LLX'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'o5vW.IEl 注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。
%ZKx0h"s0
收藏
举报
TAG: