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

简介: 笔记

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

1.png2.png


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


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


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


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

3.png

解释C语言不能函数重载


4.png


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

5.png

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

6.png



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


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

7.png

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

8.png



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


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

9.png

06f5970h 才是函数地址


10.png


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


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

11.png

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


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

12.png

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


i int d double


C语言的函数名修饰规则


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

13.png

C++调用C的库


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


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

14.png

新建一个C++项目。


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

15.png

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

16.png

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

17.png

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

18.png19.png

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


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

20.png

21.png

之后运行,仍然报错

22.png



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


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

23.png



此时程序正常运行


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


C的程序调用C++库


24.png

把C++程序改成静态库


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


25.png


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


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

26.png



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


相关文章
|
2月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
2月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
72 2
|
29天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
55 5
|
29天前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
64 4
|
27天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
61 1
|
29天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
45 2
|
29天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
39 1
|
25天前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
49 0
|
2月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
165 21
|
2月前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
28 3