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的具体实现。
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的具体实现。
相关文章推荐
- 如何有效解决C与C++的相互调用问题
- 如何有效解决C与C++的相互调用问题
- [置顶] 问题请教:C#与C++相互调用
- c++ 类之间的相互调用问题
- C&C++——C函数与C++函数相互调用问题
- C&C++——C函数与C++函数相互调用问题
- C++细节问题1-类的相互调用
- (转)如何有效解决C与C++的相互调用问题
- 关于WinRT中c++和c#相互调用的问题
- 关于WinRT中c++和c#相互调用的问题
- C与C++的相互调用问题
- c++两个类相互调用需要注意的问题
- c++和c语言中的函数相互调用的问题
- 关于WinRT中c++和c#相互调用的问题
- C函数和C++函数相互调用的问题(★firecat推荐★)
- C++随笔——成员函数的相互调用问题:
- 【c++】C与C++的相互调用问题&opencv list not found
- 关于WinRT中c++和c#相互调用的问题
- c++ 类之间的相互调用问题 .
- 如何有效解决C与C++的相互调用问题