| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> extern 和 extern “C“ -> 正文阅读 |
|
[C++知识库]extern 和 extern “C“ |
externextern 是用来进行外部声明的。
extern "C"?????????extern "C"?是C++特有的指令(C无法使用该指令),目的在于支持C++与C混合编程。 ????????extern "C"?告诉C++编译器用C规则编译指定的代码(除函数重载外,extern “C”不影响C++其他特性)。 ????????因为C和C++的编译规则不一样,主要区别体现在编译期间生成函数符号的规则不一致。 ????????由于C++需要支持重载,单纯的函数名无法区分出具体的函数,所以在编译阶段就需要将形参列表作为附加项增加到函数符号中。如以下代码
C和C++对应的的汇编码如下
容易发现,两段代码的区别仅在于函数 Function(int a, int b) 编译后对应的符号不同 C:Function C++:_Z8Functionii C++编出来的函数符号明显比C的多出了一些信息(如ii),这里多出来的后缀信息就是形参列表的参数类型信息。 extern "C"例子1
以上代码,C提供写了一个函数,用C++代码调用该函数,看起来没什么问题,但是编译的时候... 找不到对Function(int, int)的定义 来看看两个文件的汇编结果。
可以看到,MyFunction.s(源文件为.c文件)中定义的是Function,而main.s(源文件为.cpp文件)中调用的是_Z8Functionii,函数名不一样,所以连接的时候找不到函数实现。到这里我们知道C和C++编译期间后得到的函数符号不同,所以C++代码和C代码不能互相调用。 要想实现C、C++混合编程该怎么办呢?用extern "C"! 所以,extern “C”的作用就是告诉C++编译器,将指定的函数用C规则编译(注意,除了函数重载外,extern “C”不影响C++的其他特性),然后后面的事情就顺理成章了。 extern "C"例子2在一个dll动态链接库中,头文件如下:声明 fnDll1();
对应cpp中定义 fnDll1() 函数
在控制台项目中,main.cpp?通过 LoadLibrary 调用.dll
此时运行程序,结果如下 dll文件引入成功了,但是fnDll1函数却没有拿到。造成这种结果是因为,dll中的fnDll1通过C++进行编译,导致最终的名字并不是原来的了。 解决方法: 方法1:使用extern "C",修改dll头文件。这样fnDll1 仍然是 fnDll1;
方法2:使用.def导出,创建Source.def,并在配置中设置。最终名称就是.def文件中的名称。
?方法3(不推荐,仅供参考):使用fnDll1被C++编译之后的名字 在命令行中cd进入.dll文件的目录下。执行:
将 main.cpp 修改:
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 14:29:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |