C++与C语言混合编程

来源:互联网 发布:稻草人旅行怎么样 知乎 编辑:程序博客网 时间:2024/06/05 16:07
之前一直以为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 *s);

}

int main(int argc, const char * argv[]) {

    // insert code here...


    

    printf("aaaaaaaaaa\n");

    

    c1fun("abc");

    return 0;

}


main.h文件内容为空

testc1.c文件内容:

#include "testc1.h"

void c1fun(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);

}

void funcpp(char* pstr);

#endif /* defined(__BTCChinaTool__testcpp1__) */



testcpp1.cpp实现文件:

#include "testcpp1.h"

void funcpp(char* pstr)

{

    printf("%s",pstr);

}


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

testc1.c

#include "testc1.h"

extern void funcpp(char* pstr);

void c1fun(char* s)

{s);

    printf("%s",s);

    funcpp("\ncall cpp func...");

}

下边是运行结果:

aaaaaaaaaa

abc

call cpp func...

具体的程序流程是先在C++的main.cpp中调用了C语言的void c1fun(char* s)方法,在输出"abc"字符串的同时,再在这个C语言方法中调到了另一个C++函数void funcpp(char* pstr)函数以输出"\ncall cpp func...".结果输出正确。

可能有人会觉得你调的C++函数不也是和C语言的函数语法几乎一样么。没有用到对象,继承的什么的C++特性。其实并不是你想的这样,C语言的函数和这里的C++函数看起来好像一样,但实际上使用的编译器是不一样的。所以他们可以调用的系统库也是不一样的。像C++中的#include <iostream>在C语言中是没有的,如果你在C语言中引用这个C语言编译器是会报错的。