如何在C++中调用C的代码

发布时间:2017-5-1 4:45:56 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"如何在C++中调用C的代码",主要涉及到如何在C++中调用C的代码方面的内容,对于如何在C++中调用C的代码感兴趣的同学可以参考一下。

                                                                                          如何在C++中调用C的代码   以前曾经总结过一篇(http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html),关于在C中如何调用C++的代码,当时并未做完全的展开,只是简单的做了下调试,最近看到一个题目要求实现C和C++中代码的互相调用,其结果虽然都是通过extern “C”来实现,但是具体还是有些差别的。 先对C中调用C++代码作个简单回顾: 1、              对于C++中非类的成员函数,可以简单的在函数声明前面加extern “C”,通常函数声明位于头文件中,当然也可以将声明和函数定义一起放在cpp中,在没有声明的情况下,直接在定义前添加extern “C”也可 2、              对于C++类的成员函数,则需要另外做一个cpp文件,将需要调用的函数进行包装。 以上两项的实例参看前面C中如何调用C++代码的文章。 要实现C++中调用C的代码,具体操作: 对于C中的函数代码,要么将C代码的头文件进行修改,在其被含入C++代码时在声明中加入extern “C”或者在C++代码中重新声明一下C函数,重新声明时添加上extern “C”头。 通过以上的说明,我明白一点,那就是加extern “C”头一定是加在C++的代码文件中才能起作用的。   下面分析一下这个现象的实质原因: C编译器编译函数时不带函数的类型信息,只包含函数符号名字,如C编译器把函数int a(float x)编译成类似_a这样的符号,C连接器只要找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是C编译连接器的缺点。而C++编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的a函数可能编译成_a_float这样的符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么C++不支持采用函数返回值来区别函数重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。 基于以上,C调用C++,首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用,于是extern "C"的作用是:让编译器知道这件事,然后以C语言的方式编译和连接封装函数(通常是把封装函数用C++编译器按C++方式编译,用了extern "C" 后,编译器便依C的方式编译封装接口,当然接口函数里面的C++语法还是按C++方式编译;对于C语言部分--调用者,还是按C语言编译;分别对C++接口部分和C部分编译后,再连接就可以实现C调用C++了)。相反,C++调用C函数,extern "C" 的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是_a_float来找调用函数。   具体示例请见http://www.cppblog.com/Files/franksunny/CCallCpp.rar 注:如果你用VC6.0编译附件时遇到类似“fatal error C1010: unexpected end of file while looking for precompiled header directive”报错的话,请将bb.c文件做如下处理右键点击项目工程中的该文件,选择setting,在c/c++栏,选择PreCompiled headers,然后设置第一选项,选择不使用预编译头。

上一篇:数学之路(3)-机器学习(3)-机器学习算法-神经网络[18]
下一篇:Windows下 Python 安装包的配置

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款