3.C++和C混合编程
最近经常看到头文件中有
#ifdef __cplusplus
extern "C" {
#endif ....... #ifdef __cplusplus
}
#endif
这样的语句,一直搞不清楚是什么意思,今天终于闹明白了。
1.这种写法的由来
C++比C晚出现,C++代码如果能够调用C语言的代码,那么会更好的利用现有的成果,但是事实上C++代码是无法直接调用C代码的,这是因为C++编译器在编译.cpp文件时生成的函数名与C编译器在编译.c文件时生成的函数名是不一样的。
C++为了支持重载,其编译器在编译完成后会对原有的函数名进行修改,比如
test(int i)和
test(int i, int j)
这两个函数在编译完成后可能就会被C++编译器修改成:
_ZDtesti
_ZDtestii
这种样式
但是C编译器却不会修改函数名,这样问题就就来了,如果在一个C++代码中包含一个声明C函数的头文件时,那么很可能在编译完成后,头文件中声明的这个C函数名会被修改!这样在C++代码中使用这个C函数的时候就会发生找不到函数名的问题,事实上这个函数在C代码中是存在的,只不过C++编译器一厢情愿的把函数名修改了。那么如何解决呢?
2.解决办法
很简单,显式的告诉C++编译器,这段代码是用C语言编译的函数,你就不要把函数名转化为C++的格式了。
extern "C" {
int socket_send(); // 明确的告诉C++编译器,这是一个用C语言编译的函数
}
这样C++编译器在执行这段代码时,识别到extern "C"关键字,就会以C编译器的方式来编译括号内的代码。
3.由此引发的问题
这样虽然在C++编译下没有问题了,但是如果一个.c文件再去包含这个头文件时,又会发生问题,因为extern "C"不是C语言的关键字,这样.c文件又不能包含这个头文件了。如何能够既让.cpp文件能够包含这个头文件,又能让.c文件能够包含这个头文件呢,于是下面的写法就产生了:
使用条件编译的方式,如果判断是C++的编译器,就带上extern "C",如果是C的编译器就不带extern "C",由此,问题得到妥善解决。需要注意的是:__cplusplus是C++编译器内置的宏。
#ifdef __cplusplus
extern "C" {
#endif ....... #ifdef __cplusplus
}
#endif
3.C++和C混合编程的更多相关文章
- 如玫瑰一般的PHP与C#混合编程
故事背景是这样的,有一套项目,服务器端是用C#写的,为了完成某种事情,它需要使用到一个组件,这个组件很小但很重要,很不巧的是,这个这个组件是用PHP语言写的,如果为了使用这个组件而专门搭建一个PHP的 ...
- C和C++混合编程中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...
- C# 托管和非托管混合编程
在非托管模块中实现你比较重要的算法,然后通过 CLR 的平台互操作,来使托管代码调用它,这样程序仍然能够正常工作,但对非托管的本地代码进行反编译,就很困难. 最直接的实现托管与非托管编程的方法就是 ...
- [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库
前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...
- C#Matlab混合编程类 初始化问题解决方法
************** 异常文本 ************** System.TypeInitializationException: “myPlus.matClass”的类型初始值设定项引发异 ...
- 国内第一部C#.Net调用Matlab混合编程视频教程
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录:[目录]Matlab和C#混合编程文章目录 一.视频说明 2014年的5.1,我将这套视频教 ...
- 【5.1送礼】国内第一部Matlab和C#.Net混合编程视频教程【免费】
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 上一次写博客很久了 ...
- 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- 【目录】Matlab和C#混合编程文章目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...
随机推荐
- java模式之一------代理模式
代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问 代理模式的三种实现 (1)静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. e ...
- JMX 远程监控 Linux tomcat 功能实现
作者远程服务器操作系统 CentOS 7.0, tomcat 版本 7.0 1. Linux tomcat 配置 1.1 catalina_opt 配置 可以在 catalina.sh 文件中添加如下 ...
- linux端口开放
netstat 查看端口开放情况: netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 ...
- bnu 4067 美丽的花环
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4067 美丽的花环 Time Limit: 1000ms Case Time Limit: 1000m ...
- Spring部分面试知识
对Spring的理解 spring是一个轻量级的开源框架,贯穿持久层.业务逻辑层.控制层.让每一个功能模块都可以独立的分开,降低耦合度,提高代码复用度.spring通过控制反转降低耦合性,一个对象的依 ...
- 简单Json序列化和反序列化
序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得.序列化分为两大部分:序列化和反序列化.序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络 ...
- MySQL:SQL进阶
一.数据库相关理论 1.系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_s ...
- DOM操作表单
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 状态开关(ToggleButton)
状态开关(ToggleButton): 常用属性:isChecked(是否被选中,如true) 监听:1.监听方法:setOnCheckedChangeListener 2.监听器:CompoundB ...
- vmware虚拟机安装CentOS教程
linux是企业最常用的服务器系统之一,CentOS是免费的,所以用的企业也挺多,今天给大家分享怎么在自己电脑的虚拟机中安装CentOS-6.5,以便用来玩耍,没事的时候可以学学linux的一些知识. ...