returnp->f(i);</p>
- a" c0 c8 ^% m8 L$ }$ j% y }
2 P4 Q" E+ J8 O% P6 K0 a0 Y/ J
! n" n! y1 Q5 { 然后,你就可以这样调用C::f():
: ?5 M/ H* J$ {4 W; s4 f K$ l$ ^' g/ [
/*Ccode:*/; r) J6 S1 C3 m$ r& v9 v
/ p9 E' w8 D, u: d3 @$ o doublecall_C_f(structC*p,inti);
; U5 s) M; J2 h! G \+ S! {& V* h( H
voidccc(structC*p,inti)$ J2 ]8 }: C1 F, s5 P5 R1 Z
6 b( R0 D; F+ \; U+ W
{" l1 b } N0 B2 k3 F. v; {# x
/ c2 Z7 b( T$ h doubled=call_C_f(p,i);3 _% `1 K4 b- {( z, O$ z7 d
, E* ^; E/ Z0 c: [ /*…*/
0 z8 P+ ]6 u. q e6 ~3 q T% J# Y2 R9 }- z/ b
}) I3 |( B' i# F( M4 F' H
5 W2 k1 ?4 i% y' H0 i( g) z3 J8 j 如果你想在C里调用重载函数,则必须提供不同名字的包装,这样才能被C代码调用。例如:
. N5 {4 G3 _: a: D
# t- v6 F0 V" Y6 } //C++code:
! p9 c2 \, K: g( x6 ]! ^9 r! R8 U1 O
voidf(int);
9 u# L! Q1 C. |: `$ K
0 H9 c0 M" A( F! N voidf(double);) z, r+ D, m2 V9 |# p% p. p$ D& }
3 d/ ]4 q; `" N$ G! b
extern"C"voidf_i(inti){f(i);}0 m* S" I, G0 S5 @
; q9 R% \ Y) J" f& ~3 X/ u1 }
extern"C"voidf_d(doubled){f(d);}
, v3 Y3 T+ {; N* J5 c' [, n( N* z, B/ N3 E6 r
然后,你可以这样使用每个重载的f():
1 B3 u* o* I0 ]9 R% h7 k$ l+ ^( r" y1 z% H
/*Ccode:*/
( f5 T c2 f: I5 Y) _% y0 }$ m0 k; E, x# G! v
voidf_i(int);% _* t$ M, R' i/ t9 [
/ M3 q) L* u6 z
voidf_d(double);
: N2 {4 t" C% H: q& ?3 C% q; {; K8 s
voidcccc(inti,doubled)" U4 E1 m% K# W
) B0 d, A) @( O8 y: C {2 d9 h: d9 B) F) A( e/ I
) N8 X a1 T) w% F
f_i(i);7 e+ |, T! R l: L+ G
4 y. E$ ?; W/ C$ a6 V- f1 x f_d(d);" ?7 O3 ? Q% [/ l& t/ x
9 o' r) A3 u9 N: K: W# @+ X
/*…*/
1 K: z5 Q" Y" {, E( h8 X, R
- y- A* p. r# v l$ R2 l! s z }
- R% ^% n0 b- S/ a) S8 Z7 ~- Q$ |# \7 K
注意,这些技巧也适用于在C里调用C++类库,即使你不能(或者不想)修改C++头文件。 |