C中如何调用C++函数?
- p, x& R* o/ o+ @% f 前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数用extern"C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂拿来Mark一下。" ~5 [; a# w, E5 s
2 ^. p" g1 O* C# U 将C++函数声明为``extern"C"''(在你的C++代码里做这个声明),然后调用它(在你的C或者C++代码里调用)。例如:
3 m5 A% F3 Q! z5 ?, i" i
- L! e) F2 f# I* a2 o( t; c //C++code:
( c8 e6 p2 g0 R6 r6 r8 ^8 M9 z
( Q) C! {7 ~; s2 J4 a extern"C"voidf(int);+ A( n( r) V3 W' c; x6 ^
% B) T" u3 b- }7 k T+ H" [
voidf(inti)
9 N: t [/ u* L" L. q3 Z, \1 e
0 `' z" L, y4 ~$ P {
6 _2 }' ^* T# g- b
) s- }5 b0 U1 Q# ` //…+ k+ O" N8 u: l# A. o- Z
% [6 `. B V) V; h' ^ }' U& O6 X& p2 Z! {6 F
8 q3 e7 A/ s& v! x 然后,你可以这样使用f():
8 s( c8 ~. s; P# T
! z$ y4 ?4 w2 k+ n- W# ^" ^ /*Ccode:*/' R% J5 k" l7 p4 ^2 r0 o
, G6 B, x6 @0 k4 B7 E9 F. s0 V
voidf(int);
6 p* e, {6 S" W* a9 `9 n
6 _% x; k5 Z: Q# k% S6 ?+ ` voidcc(inti): t( B. Y9 B, ? T1 Y0 @7 Y
% i; v/ Q9 W/ I
{
# O% W6 l2 a" B. }% c& L% b( }- Y; _5 V6 ], G$ Y5 ^7 t7 Z
f(i);
) l1 V7 F0 [5 B1 ~- _" r5 \' K+ r8 T1 a6 N
/*…*/
" B, y s9 l4 Y' a
# ]6 }$ T; G, n3 d; ` }: E6 N5 Y( z7 d5 E
2 G7 w" S+ V4 m$ k
当然,这招只适用于非成员函数。如果你想要在C里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:( J5 g/ }: K2 D8 m$ |7 }; w
5 v0 U4 X8 o9 Z* G) Y6 D
//C++code:
' K% D$ K" F+ A
8 |, {- V8 I% |! N classC
2 y) q/ K: e8 o4 N9 p1 J; G4 X7 a7 m5 k) W' b
{2 c7 l4 C: O. v. X* ~+ }! A: [' R
+ [$ u; O" w' z ]
//…
1 a' W) k6 Z: ?; h/ n! e0 N+ |4 x4 c
virtualdoublef(int);+ u! C* M, f& I7 z/ c0 G% B# L6 W
: S" P% m" I* Q2 b2 n& B
* O; @ r2 U$ l& g }; |