今天面试的时候面试官花了不少时间琢磨一段 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:但是这里只有声明没有具体代码,能正常执行吗?