第四天——搞懂问题

问题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则告诉编译器此时不用使用启动文件

posted @ 2023-08-03 23:16  Hanabi_521  阅读(9)  评论(0编辑  收藏  举报