成都旅游网站建设规划,一个公司优化需要做多少个网站,dz论坛网站建设,ui8 wordpress主题from#xff1a;https://blog.csdn.net/gobitan/article/details/1532769在实际工作中可能经常要进行C和C的混合编程#xff0c;C调用C语言的代码通常都比较容易#xff0c;但也有一些细节需要注意。C要调用C的代码就略为麻烦一些#xff0c;因为C不支持面向对象的特征。一…fromhttps://blog.csdn.net/gobitan/article/details/1532769在实际工作中可能经常要进行C和C的混合编程C调用C语言的代码通常都比较容易但也有一些细节需要注意。C要调用C的代码就略为麻烦一些因为C不支持面向对象的特征。一、C调用C
首先我们来看一下C调用C语言的代码。要让你的C代码既能被C代码又能被C调用虽说容易但是还是有需要注意的地方。现有三个文件分别如下/* file TestC.h */#ifndef TESTC_H#define TESTC_H#ifdef __cplusplusextern C {#endifint add(int a, int b);#ifdef __cplusplus}#endif#endif /* TESTC_H *//* file TestC.c */#include TestC.hint add(int a, int b){return (a b);}/* file TestCpp.cpp */#include stdio.h#include TestC.h //TestC.h是C的头文件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的方式编译和链接。二、C调用C
下面我们就来看看如何在C语言中使用C的代码包括C类的方法。为了简单起见我将类的定义和实现放在一个文件中(通常应该是将分别放在.h和.cpp文件中)。自定义类文件(这里省略了头文件保护等其它细节)如下//* file TestClass.h */class HJH{public:int add(int a, int b){return (a b);}};将C类封装为C函数的文件为了简略也将声明和实现放在了同一个文件中如下/* file TestCpp.cpp */#include TestClass.hextern C int add_cpp(int a, int b);int add_cpp(int a, int b){HJH hjh;return hjh.add(a, b); }实际调用C代码的C文件如下/*file TestC.c */#include stdio.hextern int add_cpp(int a, int b);int main(){printf(add_cpp %d/n, add_cpp(2, 5));return 0;}上面的过程很清晰就是用一个函数将C类的使用封装起来然后将它外部声明为C函数就可以了。文件TestClass.h定义并实现了一个类该类只有一个add方法。文件TestCpp.cpp定义并实现了一个函数add_cpp函数中定义了一个HJH类对象并调用了该对象的add方法。然后将add_cpp函数进行外部声明为C。TestC.c文件中为了使用add_cpp函数也需要进行外部声明。这是为了通知编译器说明这个函数是在其他文件中实现注意在C文件中的extern后面不可加”C”。当这三个文件一起编译链接时编译器就可以找到add_cpp的具体实现。