C++与C语言混合编程

时间:2022-11-30 07:14:15


之前一直以为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文件的内容入下:


#include <iostream>
#include <stdio.h>
extern "C" {
#include "testc1.h"
void c1fun(char
}
int main(int argc, const char * argv[]) {
// insert code here...


printf("aaaaaaaaaa\n");

c1fun("abc");
return 0;
}



main.h文件内容为空






testc1.c文件内容:


#include "testc1.h"
voidc1fun(char* s)
{
printf("%s",s);
}


test1.h文件内容也为空



程序运行后的输出结果如下:


aaaaaaaaaa

abc

可见,其实对于C语言来说,头文件是可以没有的。在C++中引用C语言的函数时不用在extern "C"{ }中的声名中函数前再加一次extern了,直接名声要引用的C语言函数就可以了,只要在C文件中有这个函数编译器就会找到并正确引用。

接下来我们看一下

C语言调用C++函数:


接下来再在上边的基础上加一个C++函数:




testcpp1.h接口文件

#ifndef __BTCChinaTool__testcpp1__
#define __BTCChinaTool__testcpp1__

#include <stdio.h>
#include <iostream>
extern "C"
void funcpp(char* pstr);
}
voidfuncpp(char* pstr);
#endif /* defined(__BTCChinaTool__testcpp1__) */




testcpp1.cpp实现文件:


#include "testcpp1.h"
voidfuncpp(char* pstr)
{
printf("%s",pstr);
}

同时修改一下testc1.c文件中的方法,在其中加一句调用C++函数的语句。修改后如下:

testc1.c
#include "testc1.h"
extern voidfuncpp(char* pstr);
voidc1fun(char* s)
{s);
printf("%s",s);
funcpp("\ncall cpp func...");
}

下边是运行结果:

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语言编译器是会报错的。