一、C语言中调用C++函数

将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:

// C++ code:

extern "C" void f(int);

void f(int i)

{

     // ...

}

然后,你可以这样使用 f():

 

void f(int);

void cc(int i)

{

    f(i);

  

}

当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:

// C++ code:

class C

{

       // ...

       virtual double f(int);

};

extern "C" double call_C_f(C* p, int i) // wrapper function

{

       return p->f(i);

}

然后,你就可以这样调用 C::f():

 

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

void ccc(struct C* p, int i)

{

       double d = call_C_f(p,i);

      

}

如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:

// 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); }

然后,你可以这样使用每个重载的 f():

 

void f_i(int);

void f_d(double);

void cccc(int i,double d)

{

       f_i(i);

       f_d(d);

      

}

注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。


二、C++中调用C函数

要让你的C代码既能被C代码又能被C++调用虽说容易,但是还是有需要注意的地方。

现有三个文件分别如下:

#ifndef TESTC_H
#define TESTC_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
int add(int a, int b);
     
#ifdef __cplusplus
}
#endif
 
#endif
 
 
#include "TestC.h"
 
int add(int a, int b)
{
    return (a + b);
}
 
#include "stdio.h"
#include "TestC.h"
 
int main()
{
       printf("add = %d\n", add(2, 5));
     
       return 0;
}
 
说明:
file TestC.h是C的头文件,file TestC.c是其实现文件,file TestCpp.cpp是调用C函数的C++文件。
文件TestC.h中的TESTC_H定义是为了头文件保护,” #ifdef __cplusplus”这个不能缺少,你可以去查看C的标准库头文件中都有这个,如”stdio.h”。有了这个宏编译器就知道现在是C还是C++在调用它。
为什么要区分C与C++调用呢?其深层次原因是因为C和C++编译器在编译和链接时对于函数的处理不一样。C++为了支持函数重载在编译时会加入函数参数及类型信息。如上面的add方法,C编译器编译后在符号库中的名字为_add,而C++编译器则会产生像_add_int_int之类的名字。C++正是依靠这种机制实现了函数的重载。
extern关键字表示将函数或变量声明为全局类型,与之相对应的是static。static限定函数或变量的作用域为本文件。extern还有一个作用就是与”C”连在一起使用,即extern “C”通知编译器将extern “C”所包含的代码按照C的方式编译和链接