C和C++相互调用
发布日期:2021-07-01 04:24:33
浏览次数:2
分类:技术文章
本文共 1311 字,大约阅读时间需要 4 分钟。
文章目录
1 C++和C相互调用
C++和C相互调用:
- 实际工程中C++和C代码相互调用是不可避免的。
- C++编译器能够兼容C语言的编译方式。
- C++编译器会优先使用C++编译的方式。
- extern关键字能够强制让C++编译器进行C方式的编译。
extern关键字能够实现C 和C++的相互调用,编译方式决定符号表中的函数名的最终目标名。
extern “C”{ // do C-style compilation here}
编程实验:C++调用C函数
// add.c#include "add.h"int add(int a, int b){ return a + b;}
// add.hint add(int a, int b);
// main.cpp#include#include "add.h"int main(){ int c = add(1, 2); printf("c = %d\n", c); return 0;}
采用如下编译方式:
gcc add.c -c -o add.o (OK)
g++ main.cpp add.o (error) : /tmp/ccbiexce.o: In function main:
9main.cpp:(.text+0x19): undefined reference to add(int, int) collect2: error: ld returned 1 exit status将main.cpp更改成如下形式即可顺序编译通过:
// main.cpp#includeextern "C"{ #include "add.h"}int main(){ int c = add(1, 2); printf("c = %d\n", c); return 0;}
2 如何保证一段C代码只会以C的方式被编译?
解决方案:
- __cplusplus是C++编译器内置的标准宏定义;
- __cplusplus的意义:确保C代码以统一的C方式被编译成目标文件。
#ifdef __cplusplusextern "C" { #endif //C-style Compilation#ifdef __cplusplus}#endif
// 将main.cpp更改为如下形式即可#include#ifdef __cplusplusextern "C" { #endif#include "add.h"#ifdef __cplusplus}#endifint main(){ int c = add(1, 2); printf("c = %d\n", c); return 0;}
注意事项:
- C++编译器不能以C的方式编译重载函数。
- 编译方式决定函数名被编译后的目标名。
- C++编译方式将函数名和参数列表编译成目标文件。
- C编译方式只将函数名作为目标名进行编译。
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/104127051 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月21日 13时59分39秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Proftpd MySQL [Step by Step]
2021-07-05
EFI Shell 命令参考
2021-07-05
HP-UX oracle RAC 双机实践
2021-07-05
解决SHELL脚本中的export无法生效的问题【转】
2021-07-05
linux中的sh脚本语法【转】
2021-07-05
区别数据结构中的堆栈与内存中的堆栈的个人总结【转】
2021-07-05
c++中冒号(:)和双冒号(::)的用法【转】
2021-07-05
python中各种下划线的含义
2021-07-05
《计算机视觉-一种现代方法(第2版)》读书笔记三:早期视觉(一幅图像)
2019-05-02
《计算机视觉-一种现代方法(第2版)》读书笔记六:应用之图像搜索和检索
2019-05-02
如何撰写高水平的学术论文
2019-05-02
谭浩强《C++面向对象程序设计》知识点总结
2019-05-02
分享一个关于介绍TextCNN和TextRNN的文章
2019-05-02
关于CNN中感受野的理解和计算方法
2019-05-02
java基础----RandomAccessFile
2019-05-02
__attribute__((packed))
2019-05-02
Android深入浅出之Binder机制
2019-05-02
linux查看硬件信息
2019-05-02
linux支持大于4G内存
2019-05-02
WM_GETINFO相关
2019-05-02