您的位置:首页 > 编程语言 > C语言/C++

C与C++的相互调用问题

2014-11-15 20:13 344 查看
extern "C"的双重含义

extern 是C/C++ 语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住下列语句:



1 extern int a;



2 C与C++的相互调用:

作为一种面向对象的语言,C++ 支持函数重载,而过程式语言C 则不支持。函数被C++ 编译后在符号库中的名字与C 语言的不同。

void foo(int x, int y);

该函数被C 编译器编译后在符号库中的名字为_foo ,而C++ 编译器则会产生像_foo_int_int 之类的名字



extern "C"的惯用法

(1)在C++ 中引用C语言中的函数和变量,在包含C 语言头文件(假设为Example.h )时,需进行下列处理:

extern "C"

{

#include"cExample.h"

}

而在C 语言的头文件中,对其外部函数只能指定为extern 类型,C 语言中不支持extern "C" 声明,在.c 文件中包含了extern "C"时会出现编译语法错误

error: expected identifier or ‘(’ beforestring constant)。



3 首先我们来看一下C++调用C语言的代码

/* file TestC.h */

#ifdef __cplusplus

extern "C" {

#endif

int add(int a, int b);

#ifdef __cplusplus

}

#endif

/* file TestC.c */

#include "TestC.h

int add(int a, int b)

{

return (a + b);

}

/* file TestCpp.cpp */

#include "stdio.h"

#include "TestC.h" [b]注:CPP文件中可以直接引用 .h 的头文件[/b]

int main()

{

printf("add = %d/n", add(2, 5));

return 0;

}



4 C 引用C++ 函数工程例子

/* C++ code */


extern "C" void f(int); //声明

void f(int i)

{

//定义函数体

}



/* C code: */

extern void f(int); //声明

void cc(int i)

{

f(i); //调用

}



5 下面我们就来看看如何在C语言中使用C++的代码(C++类的方法)。为了简单起见,我将类的定义和实现放在一个文件中(通常应该是将分别放在.h和.cpp文件中)。

/* file TestClass.h*/
classTest //定义类
{
public:
int add(int a, int b)
{
return (a + b);
}
};

将C++类封装为C函数的文件(为了简略也将声明和实现放在了同一个文件中)如下:
/* file TestCpp.cpp*/
#include "TestClass.h"
extern "C" int add_cpp(int a,int b);

int add_cpp(int a, int b)
{
Test test;
returntest.add(a,b);
}

实际调用C++代码的C文件如下:
/*file TestC.c */
#include "stdio.h"
extern intadd_cpp(int a, int b); //声明CPP中函数
int main()
{
printf("add_cpp = %d/n", add_cpp(2, 5));
return 0;
}
上面的过程很清晰,就是用一个函数将C++类的使用封装起来,然后将它外部声明为C函数就可以了。
文件TestClass.h定义并实现了一个类,该类只有一个add方法。文件TestCpp.cpp定义并实现了一个函数add_cpp,函数中定义了一个Test类对象并调用了该对象的add方法。然后将add_cpp函数进行外部声明为C
TestC.c文件中为了使用add_cpp函数,也需要进行外部声明。这是为了通知编译器说明这个函数是在其他文件中实现(注意在C文件中的extern后面不可加”C”)。当这三个文件一起编译链接时,编译器就可以找到add_cpp的具体实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: