returnp->f(i);</p>
5 g5 l3 S5 c( w7 @ }
3 ?& m$ y( V- V! d) C
( x6 U* ]+ M, A, E 然后,你就可以这样调用C::f():
2 p) j6 H3 A# ?" ]: j9 O' F1 ^+ R/ ] m; k# ^# K8 K4 R" [
/*Ccode:*/
- B2 {+ h0 x) ]5 v% K% o1 t9 r3 K
doublecall_C_f(structC*p,inti);
$ k9 l( n q) l" I6 X& d
3 U S( f3 _+ n' W voidccc(structC*p,inti)$ M8 o l+ H8 x3 {6 _; f
7 A, V1 z8 t0 i0 l& T {
5 Y1 V& T. ~6 X( A1 @2 u0 `0 P* p4 w: R# ~
doubled=call_C_f(p,i);
1 f5 F# n* B1 R6 Z( u
3 ~$ b/ n) [4 h- h0 n0 ?) C /*…*/
8 Z% x: ^0 Q1 A& P8 C" |# ]4 J; y7 G3 `8 j. X3 J2 }9 z# j
}
1 U5 m9 o6 @ p/ R' u$ s% x
0 `. V0 Y) m; i1 Q) A7 ~ 如果你想在C里调用重载函数,则必须提供不同名字的包装,这样才能被C代码调用。例如:, l: z9 _! E, V: \5 ]* _# _
8 U9 A7 \: A( [# |; s, H) g& i8 W
//C++code:8 T# l9 C+ @+ q: ?' c3 S4 B
0 N% E+ e9 o7 s. d voidf(int);
9 p" k6 o* s B0 R! b6 s
5 C+ Y' z8 T* I( R voidf(double);6 j+ n$ A* R- U5 A% L
/ S. p% m2 l+ W) a
extern"C"voidf_i(inti){f(i);}
" A) J f% ~) L7 E5 C/ k5 e; H& A; ?7 T0 \, i: @2 y" O t) M4 Z& ?, Y
extern"C"voidf_d(doubled){f(d);}
# v, b3 C) }5 E( m1 x, C; C3 a* n+ m$ U! ^4 j b3 x
然后,你可以这样使用每个重载的f():4 b/ t$ V9 z. \. S
$ a+ c+ @, @9 t! G8 f/ [ /*Ccode:*/6 o+ Q$ Q7 X: w0 [4 }
- _( W1 q h: P" N d voidf_i(int);
6 P# A: d: \: w5 J
& B3 r* ~6 y7 V5 O voidf_d(double);2 t1 h: B6 y2 c5 Q) v& v- v
0 ^. B6 o; @8 Z) y
voidcccc(inti,doubled)! ?( `5 L3 {# X& @$ c3 {% }% ^" R
8 H1 K9 K+ `9 }4 v; `/ I! b( W6 c7 Q {
4 ~& N( x' p+ ?3 O) ~; K3 F0 x8 h ]0 P6 ]- ^1 L
f_i(i);
- P6 g; X% O/ S0 Q$ i1 x* K" w1 {2 Y
f_d(d);7 {! P* U) t' T6 b+ e
& e, G# E" Y! K5 e! B H
/*…*/
2 y, ^: i' n/ l2 C/ P0 ~& \7 `% d1 X! `1 l9 w
}
/ A: [6 k" c( C$ f/ G) H% X+ r- y: L8 X( z# c( q
注意,这些技巧也适用于在C里调用C++类库,即使你不能(或者不想)修改C++头文件。 |