C语言的函数签名,关于C/C++编译时的函数签名及连接过程

本文探讨了C语言中函数签名的特点,指出C的函数签名仅包含函数名,不同于C++的函数名+参数类型。在C中,即使参数不匹配也能编译通过,但在连接阶段可能出错。同时,文章提到了函数调用时参数逆序进栈的现象,并讨论了其可能的原因。最后,作者通过实验验证了C和C++在此问题上的差异,提出对于参数不匹配的情况,早期报错可能更有利于防止潜在的bug。
摘要由CSDN通过智能技术生成

今天面试的时候面试官花了不少时间琢磨一段 C 程序代码,因为之前自己学的时候喜欢看很多相关东西,而且确实看过有关编译器实现的部分细节所以基本也都答出来了,但确实被问到的时候而且在面试后自己试了一下才惊叹于这样居然也可以编译通过...

先说结论:C 函数签名只有函数名(我只记得 C++ 是函数名+参数类型了2333)

调用函数时参数进栈顺序是逆序(原因待考究)

相关知识点:函数调用原理,编译器对函数的签名,编译大体流程

涉及这个问题面试问答大体流程

考虑如下 C 代码:#include

#include

int main()

{

printf("%d", strlen("hello"));

return 0;

}面试的时候首先让介绍了 #include 是什么(是预处理指令,在编译阶段进行处理,功能是引入相关文件代码,但并不是简单直接插入,因为要处理一些变量作用域等其他问题),下面大概是问答的过程

Q:如果将 #include 注释掉能否编译通过?

A:不能,因为一个函数要调用,必须要有相应的声明以及实现。

Q:如果将 string.h 文件里的内容写到 main 函数前能否编译通过?具体来说,插入一行 int strlen(char *);

A:可以编译,因为编译器已经找到了 strlen 的声明知道该如何调用这个函数。

Q:但是这里只有声明没有具体代码,能正常执行吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值