C++杂忆集(六)
2017-08-24 10:50
120 查看
C++与C混合编程中的extern "C"
在我们使用C++为主体,混合使用C语言进行编程的时候,对于初学者而言最常遇见的一个问题是在编译的过程中,无法连接到目标函数。这是为什么呢?这我们就需要知道另一件事情,C++支持函数重载。
C++的函数重载究竟是如何实现的呢?其实在C++源码中的函数名称并非是编译后的名称,实际上这种处理是编译器做的,隐蔽而又常被人们忽略。C++编译器会给我们所写的函数添加前后缀,而且是和函数参数列表密切相关的。C语言不支持重载,编译后的目标函数名就是源码中所给的函数名。
这时候,我们就需要明确的告知编译器,将要连接的是C函数,这时候就需要用到extern关键字了。例如在某个C++的头文件中我们声明一个函数,并且是C函数:
这样便可以通过编译了,其实并不仅仅用于修饰C语言的函数,也可以用于变量,目的就是告知编译器,以下的代码块需要按照C语言方式编译和连接。
在我们使用C++为主体,混合使用C语言进行编程的时候,对于初学者而言最常遇见的一个问题是在编译的过程中,无法连接到目标函数。这是为什么呢?这我们就需要知道另一件事情,C++支持函数重载。
C++的函数重载究竟是如何实现的呢?其实在C++源码中的函数名称并非是编译后的名称,实际上这种处理是编译器做的,隐蔽而又常被人们忽略。C++编译器会给我们所写的函数添加前后缀,而且是和函数参数列表密切相关的。C语言不支持重载,编译后的目标函数名就是源码中所给的函数名。
这时候,我们就需要明确的告知编译器,将要连接的是C函数,这时候就需要用到extern关键字了。例如在某个C++的头文件中我们声明一个函数,并且是C函数:
#ifndef ___ABC_H__ #define ___ABC_H__ extern "C" // 明确告知编译器,无需转换格式,该函数为C语言格式的函数 { int Func_C(int i); } #endif
这样便可以通过编译了,其实并不仅仅用于修饰C语言的函数,也可以用于变量,目的就是告知编译器,以下的代码块需要按照C语言方式编译和连接。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- 利用C/C++编写node.js原生模块的方法教程
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- 分享一下8年C++面向对象设计的经验体会
- c++指针使用形参改变实参的方法
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++如何删除map容器中指定值的元素详解
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法