posts - 297,  comments - 15,  trackbacks - 0

How do I call a C function from C++?

Just declare the C function ``extern "C"'' (in your C++ code) and call it
(from your C or C++ code). For example:
	// C++ code

extern "C" void f(int); // one way

extern "C" { // another way
int g(double);
double h();
};

void code(int i, double d)
{
f(i);
int ii = g(d);
double dd = h();
// ...
}
The definitions of the functions may look like this:
	/* C code: */

void f(int i)
{
/* ... */
}

int g(double d)
{
/* ... */
}

double h()
{
/* ... */
}

Note that C++ type rules, not C rules, are used. So you can't call function declared ``extern "C"''
 with the wrong number of argument. For example:
	// C++ code

void more_code(int i, double d)
{
double dd = h(i,d); // error: unexpected arguments
// ...
}

How do I call a C++ function from C?

Just declare the C++ function ``extern "C"'' (in your C++ code) and
call it (from your C or C++ code). For example:
	// C++ code:

extern "C" void f(int);

void f(int i)
{
// ...
}
Now f() can be used like this:
	/* C code: */

void f(int);

void cc(int i)
{
f(i);
/* ... */
}
Naturally, this works only for non-member functions. If you want to call
 member functions (incl. virtual functions) from C, you need to provide
 a simple wrapper. For example:
	// C++ code:

class C {
// ...
virtual double f(int);
};

extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p->f(i);
}
Now C::f() can be used like this:
	/* C code: */

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

void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}
If you want to call overloaded functions from C, you must provide wrappers with distinct names
for the C code to use. For example:
	// C++ code:

void f(int);
void f(double);

extern "C" void f_i(int i) { f(i); }
extern "C" void f_d(double d) { f(d); }
Now the f() functions can be used like this:
	/* C code: */

void f_i(int);
void f_d(double);

void cccc(int i,double d)
{
f_i(i);
f_d(d);
/* ... */
}
Note that these techniques can be used to call a C++ library from C code
even if you cannot (or do not want to) modify the C++ headers.
posted on 2008-07-19 01:39 chatler 阅读(157) 评论(0)  编辑 收藏 引用 所属分类: C++_BASIS

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(10)

随笔分类(307)

随笔档案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感觉这个博客还是不错,虽然做的东西和我不大相关,觉得看看还是有好处的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新评论

阅读排行榜

评论排行榜