C++学习———C/C++ 程序是如何执行的

众所周知——我们在学习的时候,课本上是这样写的,一个程序的执行需要四步:::

源文件 经过预处理阶段 -> 编译阶段 -> 汇编阶段 -> 链接阶段 -> 可执行

下面以一个平凡的例子,来描述自己的疑惑和所学。

#include <stdio.h>
int main()
{
    printf("hello");
    return 0;
}

1、预处理阶段。

预处理器根据以字符 # 开头的命令,修改原始的C程序。例如,hello.c 的第一行 #include <stdio.h> 命令告诉预处理器读取系统头文件的内容,并把其直接插入到程序文本中,结果就得到了另一个文件,通常以点 i 作为文件扩展名。

#include < >  直接按系统标准方式检索文件目录。

#include " "  在当前的源文件的目录中寻找,找不到再按照系统标准方式检索其他文件目录。

2、编译阶段。

编译器将文本文件 hello.i 翻译成成文本文件 hello.s ,它包含一个汇编语言程序。

3、汇编阶段。

汇编器将 hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件  hello.o 中,其是一个二进制文件。

4、链接阶段

hello程序调用了 printf 函数,printf 函数存在于一个名为 printf.o 的单独的预编译好的文件中,而这个文件需要以某种形式合并到 hello.o 中,连接器就负责这里的合并。

下图为上面四个阶段的图形表示。

存在一个问题,

在预处理阶段,将 #include<stdio.h>加载进来后,有了printf 函数的声明,后面的链接阶段,是如何知道 printf 的实现位置,进而链接。??(从头文件如何知道函数原型的实现位置)

猜你喜欢

转载自blog.csdn.net/JACKSONMHLK/article/details/112105915