之前一直以为C++和C语言是一样的,可以很方便的互相调用,昨天想把一个C语言项目编译到C++语言的项目中时才发现,C语言和C++还是有一定区别的,最少互相之间的调用并不像想象中的那么简单。在网上找到了一些资料作为参考,这里也写一下我的互相调用的方法。
参考资料一:
http://blog.sina.com.cn/s/blog_6163bdeb0100qdu4.html
参考资料二:
http://blog.sina.com.cn/s/blog_674cc1fd0100jirq.html
我的调用例子:
C语言的引用和C++语言的引用还有一些不同,C语言的引用是真真正正的引用,就像文件复制一样的引用,当你引用一个.c文件时其实就相当于你把那个.c文件又在你的文件中写了一遍一样。他并不是只引用了接口。甚至你都不需要引用任何东西,只要用
extern void c1fun( char *s);
把你的要用的外部函数声名一下就可以了,编译器会自动从所有文件中查找相关定义的函数,找不到才会报错。如果同时有两个同名且参数类型一样的函数,编译器会报一个重复定义的错误。
下边总结一下,
C++调用C语言
我新建了一个项目,有一个main.cpp的C++文件以及一个main.h的头文件,另外还有一个C语言的.c文件和.h头文件。
main.cpp文件的内容入下:
test1.h文件内容也为空
程序运行后的输出结果如下:
aaaaaaaaaa
abc
可见,其实对于C语言来说,头文件是可以没有的。在C++中引用C语言的函数时不用在extern "C"{ }中的声名中函数前再加一次extern了,直接名声要引用的C语言函数就可以了,只要在C文件中有这个函数编译器就会找到并正确引用。
接下来我们看一下
C语言调用C++函数:
接下来再在上边的基础上加一个C++函数:
testcpp1.cpp实现文件:
同时修改一下testc1.c文件中的方法,在其中加一句调用C++函数的语句。修改后如下:
下边是运行结果:
aaaaaaaaaa
abc
call cpp func...
具体的程序流程是先在C++的main.cpp中调用了C语言的voidc1fun(char* s)方法,在输出"abc"字符串的同时,再在这个C语言方法中调到了另一个C++函数void funcpp(char* pstr)函数以输出"\ncall cpp func...".结果输出正确。
可能有人会觉得你调的C++函数不也是和C语言的函数语法几乎一样么。没有用到对象,继承的什么的C++特性。其实并不是你想的这样,C语言的函数和这里的C++函数看起来好像一样,但实际上使用的编译器是不一样的。所以他们可以调用的系统库也是不一样的。像C++中的#include <iostream>在C语言中是没有的,如果你在C语言中引用这个C语言编译器是会报错的。