注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

C++与C语言混合编程  

2015-09-15 08:38:15|  分类: C语言 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
之前一直以为C++和C语言是一样的,可以很方便的互相调用,昨天想把一个C语言项目编译到C++语言的项目中时才发现,C语言和C++还是有一定区别的,最少互相之间的调用并不像想象中的那么简单。在网上找到了一些资料作为参考,这里也写一下我的互相调用的方法。
参考资料一:
参考资料二:
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语言编译器是会报错的。

  评论这张
 
阅读(211)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017