首页 > 其他分享 >随想录(c&cpp之间的相互调用)

随想录(c&cpp之间的相互调用)

时间:2022-11-23 11:01:35浏览次数:34  
标签:调用 return int 随想录 mov add 89 cpp


【 声明:版权所有,欢迎转载,请勿用于商业用途。 】


    作为系统工程师,平时用c可能多一些。这两天因为工作的原因,了解了linux上面cpp的编写方法。很多时候,cpp对编写者的要求比较高,在市场上面的应聘者也比较少,所以大多数公司都是选择c和脚本作为开发语言。但是有一些项目,比如机器学习、ros系统,要是用上它,那么cpp是绕不过去的。下面,我就简单说一下c&cpp相互调用的事情。


1、在cpp下面,不同的函数可以用同一个函数名字,

int add() {

return 0;
}

int add(int a){

return a;
}


2、看一下反汇编出来是什么样的,

121 000000000040052d <_Z3addv>:
122
123 int add() {
124 40052d: 55 push %rbp
125 40052e: 48 89 e5 mov %rsp,%rbp
126
127 return 0;
128 400531: b8 00 00 00 00 mov $0x0,%eax
129 }
130 400536: 5d pop %rbp
131 400537: c3 retq
132
133 0000000000400538 <_Z3addi>:
134
135 int add(int a){
136 400538: 55 push %rbp
137 400539: 48 89 e5 mov %rsp,%rbp
138 40053c: 89 7d fc mov %edi,-0x4(%rbp)
139
140 return a;
141 40053f: 8b 45 fc mov -0x4(%rbp),%eax
142 }
143 400542: 5d pop %rbp
144 400543: c3 retq
145


3、从代码可以看出来其实g++编译器对两个函数做了修改,我们看如果用extern "c"来解决会怎么样

$ g++ hello.cpp -g -o hello
hello.cpp:5:15: error: declaration of C function ‘int add(int)’ conflicts with
int add(int a);
^
hello.cpp:4:6: error: previous declaration ‘int add()’ here
int add();


4、从消息来看,说明在extern的情况下其实只能有一个add。没关系,我们可以删除一个add,

127 int add(int a){
128 40052d: 55 push %rbp
129 40052e: 48 89 e5 mov %rsp,%rbp
130 400531: 89 7d fc mov %edi,-0x4(%rbp)
131
132 return a;
133 400534: 8b 45 fc mov -0x4(%rbp),%eax
134 }
135 400537: 5d pop %rbp
136 400538: c3 retq
137


5、实验说明了显式调用函数的时候,最好添加extern "C"。

如果cpp调用c库,那么c库中header头文件中对函数原型的声明一定要有extern "C"

如果是c调用cpp,那么cpp库中header头文件中函数原型的部分一定要有extern "C"



标签:调用,return,int,随想录,mov,add,89,cpp
From: https://blog.51cto.com/u_15888909/5880573

相关文章

  • 随想录(比技术更重要的是产品)
    【声明:版权所有,欢迎转载,请勿用于商业用途。  一般来说,做技术开发的同学往往对功能、技术和性能比较热衷,但是对产品却非常忽视。不管什么样的技术,最终都要以产品的形式......
  • c++ 调用 python 2.7
    本来想调用python3.10的,但一直安装不成功,先记录一下python2.7。先上代码:#include<iostream>usingnamespacestd;#include"Python.h"intmain(intargc,cha......
  • 代码随想录day2| 977,209,59
    977.暴力法:整个数组平方,然后再nums.sort(),时间复杂度O(nlogn)空间复杂度O(1)双指针法:从两头开始遍历,l,r指向当前有可能的最大值,i象征着新数组对应的位置,从大到小,时间复杂度......
  • CPP2nd CRTP Facade 模式
    书中源码不全,看看我这个?#include<iostream>#include<type_traits>#include<vector>#include<iterator>template<typenameDerived,typenameValue,typenameCa......
  • 代码随想录算法训练营第七天 | 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ●
    今日任务●454.四数相加II●383.赎金信●15.三数之和●18.四数之和●总结详细布置454.四数相加II建议:本题是使用map巧妙解决的问题,好好体......
  • 代码随想录算法训练营Day07|454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数
    代码随想录算法训练营Day07|454.四数相加II、383.赎金信、15.三数之和、18.四数之和454.四数相加II题目链接:454.四数相加II题干交代四个数组的长度相等,所以我......
  • memcached 使用与go客户端调用
    介绍详细的介绍参考:​​​https://www.runoob.com/memcached/memcached-tutorial.html​​由于memcached仅仅是一个高度内存的kv存储块,如果有更严谨的需求,需要如下选择:集......
  • C语言中调用可执行程序的方法。
    在C/C++程序中,经常需要调用其它的程序来先成某项任务,例如其它的C/C++程序、操作系统命令或Shell脚本,C/C++提供了exec函数族和system函数来实现这个功能。一、exce函数族exec......
  • Windows RPC 远程过程调用 初探
    WindowsRPC远程过程调用初探参考资料https://bbs.pediy.com/thread-262291.htmWindowsRPC远程过程调用---初理解RPC简单理解RPC(Remoteprocedurecall远程过......
  • javascript-代码随想录训练营day7
    454.四数相加Ⅱ题目链接:https://leetcode.cn/problems/4sum-ii/题目描述:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,......