第四天——搞懂问题
问题1:#include <stdio.h> 和 #include "stdio.h" 有什么区别?
1、#include<>一般用于包含系统头文件,诸如stdlib.h、stdio.h、iostream等;
2、#include""一般用于包含自定义头文件,比如我们自定义的test.h、declare.h等。'
这是因为:
查找范围不同:
""会优先查找自己项目工程下文件,查到后就不会再去系统类库中找。
<>会从系统类库中去找。
问题2:stdio.h 文件在哪里?里面是什么内容?
预处理指令
发现都是#开头的。
#include 则是关注的重点,它的目的就是把多个编译单元(也就是c或者cpp文件)公用的内容,单独放在一个文件里减少整体代码尺寸;或者提供跨工程公共代码。
用gcc -E hello.c >cat.txt 将预处理时的操作给输出到cat.txt文件中,然后发现stdio.h在这里
然后按照路径去找。找到了
然后打开后发现其实和 cat.txt里前面内容差不多,extern 一些函数,以及include其它头文件,还有define一些魔数。
给出问题答案:stdio.h文件为usr/include下,里面的内容就是引用一些extern函数,include别的头文件以及用define定义一些宏或者魔数。
该问题参考文章
https://blog.csdn.net/weixin_45283376/article/details/123739001
问题3:为什么入口是 main 函数?可以写一个程序入口不是 main 吗?
这个问题作者给出了回答,main函数其实是由_start函数去调用,这个_start函数被定义在crt1.o中。
如果不用main函数,则需要做到_start函数执行的功能:
_start 函数主要功能有两个,第一是准备参数,我们的 main 不使用任何参数,所以这一部分可以忽略。
第二是处理返回值,具体的处理方式是使用 main 函数的返回值调用 exit 系统调用进行退出。
所以如果我们不使用启动文件的话,只需要自己使用系统调用退出即可。
如果不用启动文件,这时候指令为
gcc -e nomain -nostartfiles -c hello.c
ld -e nomain -o hello hello.o
其中-e指定了入口为nomain函数,而-nostartfiles则告诉编译器此时不用使用启动文件