• C语言为什么不支持函数重载?C和C++程序怎样互调?


    目录

    解释C语言不能函数重载 

     C++调用C的库

     C的程序调用C++库


    在搞清楚这个问题之前,我们先弄清楚程序环境和预处理

    C语言——程序环境和预处理_头发没有代码多的博客-CSDN博客

     预编译阶段:生成test.i文件

    编译阶段:test.i文件变为test.s文件,这个时候建立栈帧给局部变量开空间等等

    汇编阶段:test.s文件变为test.o文件,符号表就是会给这些全局或函数变量一个地址

    链接:将同一个项目下的.o文件合并,生成.exe文件 ,这个阶段会进行符号表的重定位(重新进行全局变量或函数的地址匹配)

    解释C语言不能函数重载 

    在 linux系统下建立三个文件,用gcc运行会报错,而g++运行则不会

     func.o文件里面是二进制机器码,只不过我们所看到的是一些汇编代码

     在gcc下进行编译不能直接转换成对应的机器码。

    每个.o文件最前面是与栈帧有关的一些东西,只不过是被转换成了机器码

     而在函数调用的时候,要转换成一个汇编指令,这个汇编指令是call

    call 一个地址,这个地址是jump指令的地址

    函数地址是函数调用第一个指令的地址 

    06f5970h 才是函数地址

    在main.o里面要调用函数,没有这俩个函数的地址 ,因为main.c文件里面只包含了.h文件(函数的声明),这个在编译阶段能过因为进行了声明,即使没有定义函数也能过,当执行call指令和jump指令时候,需要找到函数的第一句,即函数的定义,此时fun.c有函数的定义,而且有俩个

    链接的工作:把.o目标文件合并到一起,还需要一些只给了声明的函数或变量的地址,如果找不到地址就会报链接错误,编译器会通过符号表寻找函数

    C语言如果有俩个相同名字函数,则符号表会一样,这样导致在通过符号表找函数的时候就会出错

    C++提出了函数名修饰规则

     函数名是:函数名+参数类型首字母

    i int d double 

    C语言的函数名修饰规则

    函数名就直接是函数名,这会导致符号表在重新定位的时候会报错,所以会发生连接错误

     C++调用C的库

    C++程序可以调用C语言写的库,C语言也能调用C++写的库,但需要一些处理 

    把用C语言实现的栈转为静态库

     

     新建一个C++项目。

    用C++程序调用C的库,先包头文件,链接的时候才回去库中找程序

    但此时会报错,我们用路径去包含 

    此时编译不会报错,但运行会报错,报连接错误,这是因为没有找到这些函数的定义,函数的定义我们刚才封装到了静态库中

     接下来,我们把静态库加进去

     

    附加库目录输入.lib文件的目录

    然后 切换到输入,附加依赖项

     

     之后运行,仍然报错

    这是因为我们用C++编译器找C的库, 函数修饰规则不一样

    此时输入extern "C",并把包含的头文件给括起来

    此时程序正常运行

    extern"C"作用,告诉C++编译器,这里面的这些函数是C的库实现的,用C的规则去链接查找他们

     C的程序调用C++库

     

    把C++程序改成静态库

     创建一个.C文件,之后跟上面做同样操作,引入静态库

    此时,仍然会链接报错,接下来跟上面有点区别,不可能让C的编译器认识C++的库,只能修改C++的库,在C++的库加extern "C“,就是告诉编译器调用这些函数的时候按照C的规则来

    但仍然会有一些问题,编译还会报错,这是因为C的编译器不认识extern ''C''

    引入C++的宏去做条件编译,就能解决该问题 

  • 相关阅读:
    使用Notepad++的正则表达式更改字母大小写
    计算机视觉学习记录(六):深度学习基础
    Pandas 使用教程 JSON
    HTML-09.表单项标签
    KVM报错:Unable to connect to libvirt qemu:///system. 确定 ‘libvirtd’ 守护进程正在运行。
    2.MongoDB 用户管理
    深入了解JVM之⭐《优化JIT》⭐
    Redis数据类型之List类型
    Zookeeper整理
    【腾讯云云上实验室-向量数据库】TAI时代的数据枢纽-向量数据库 VectorDB
  • 原文地址:https://blog.csdn.net/weixin_49449676/article/details/126463315