Menu Close

C语言编译过程

我们写出的C语言代码(.c文件),若要在机器上运行,需要经过一个编译过程.

什么是编译?

编译是将源代码转换为目标代码的过程。这是在编译器的帮助下完成的。编译器检查源代码中的语法或结构错误,如果源代码无错误,则生成目标代码。
c
编译过程c编译过程将作为输入的源代码转换为目标代码或机器代码。编译过程可以分为四个步骤,即预处理,编译,汇编和链接。
预处理器将源代码作为输入,并从源代码中删除所有注释。预处理器采用预处理器指令并对其进行解释。
例如,如果某个指令在程序中可用,则预处理器将解释该指令并将该指令替换为’stdio.h’的内容。
以下是我们的程序在转换为可执行形式之前所经过的阶段:
  • 预处理
  • 编译
  • 汇编
  • 链接

c中的编译过程

预处理 (Preprocessing)

源代码是在文本编辑器中编写的代码,并且源文件的扩展名为” .c”。该源代码首先传递给预处理器,然后预处理器扩展该代码。
扩展代码后,将扩展的代码传递给编译器。
预处理主要进行以下几个方面的处理:

1)、宏定义指令,如#define、M a;

对于这种伪指令,预编译所要做的是将程序中的所有M用a来替换,一定要注意作为字符常量a则不被替换(因为已经是常量,其值已经是确定的)。与之相对应的还有#undef,则是将取消对某个宏的定义,使之在后面出现时再不被替换。

2)、条件编译指令,如#ifdef、 #ifndef、#else、#elif、#endif等。

这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。换言而之也就是预编译程序将根据有关的文件,将哪些不必要的代码过滤掉。

3)、头文件包含指令,如#include等。

在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含各种外部符号的声明。采用头文件的主要目的是为了使某些定义可以供多个不同的C源程序使用。因为当需要使用到这些定义的C源程序中,只需要加上一条#include语句即可,而不必在此文件中将这些定义重复一遍。预编译程序将把头文件中定义统统加入到它所产生的输出文件中,以供编译程序对之处理。在linux操作系统中包含到C源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include/目录下。在程序中使用它们,#include要使用尖括号<>;另外开发人员也可以定义自己的头文件,这些文件一般与C源程序放在同一目录下,此时在#include中要使用””。

4)、特殊符号,预编译程序可以识别一些特殊的符号。

例如,在源程序中出现的LINE标识符将被解释为当前行号(十进制),FILE则被解释为当前被编译的C源程序的文件名称,FUNCTION则被解释为当前被编译的C源程序中的函数名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换,这些常常是配套使用,用来进行对程序的调试。

预编译程序所完成的基本上是对源程序的”替换”工作。经过此替换后,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。

编译 (Compilation)

由预处理器扩展的代码将传递给编译器。编译器将此代码转换为汇编代码。或者我们可以说C编译器将预处理的代码转换为汇编代码。编译阶段所有做的工作就是通过词法分析和语法分析,在确认所有指令都符合语法规则之后,将其翻译成等价的中间代码或者是汇编代码。

汇编 (Assemble)

通过使用汇编器将汇编代码转换为目标代码。汇编器生成的目标文件的名称与源文件的名称相同。在DOS中,目标文件的扩展名是” .obj”,在UNIX中,目标文件的扩展名是” o”。如果源文件的名称为’hello.c’,则目标文件的名称将为’hello.obj’。

链接 (Linking)

主要,所有用C编写的程序都使用库函数。这些库函数是预编译的,并且这些库文件的目标代码以’.lib'(或’.a’)扩展名存储。链接器的主要工作是将库文件的目标代码与程序的目标代码结合在一起。有时,当我们的程序引用其他文件中定义的功能时,就会出现这种情况;那么链接器在其中起着非常重要的作用。它将这些文件的目标代码链接到我们的程序。
因此,我们得出结论,链接器的工作是将程序的目标代码与库文件和其他文件的目标代码链接起来。链接器的输出是可执行文件。可执行文件的名称与源文件的名称相同,只是扩展名不同。在DOS中,可执行文件的扩展名为” .exe”,而在UNIX中,可执行文件的命名为” a.out”。例如,如果我们在程序中使用printf()函数,则链接器会将其关联的代码添加到输出文件中。
让我们通过示例来理解。
hello.c
#include <stdio.h>
int main()
{
    printf("Hello World");
    return 0;
}

 

在上述流程图中,采取了以下步骤来执行程序:
  • 首先,将输入文件 hello.c 传递给预处理器,然后预处理器将源代码转换为扩展的源代码。
  • 将扩展的源代码传递给编译器,然后编译器将此扩展的源代码转换为汇编代码。
  • 然后将此汇编代码发送到汇编器,由汇编器将汇编代码转换为目标代码。
  • 创建目标代码后,链接器将创建可执行文件。
  • 然后,加载程序将加载可执行文件以供执行。

在Code:Block编译器下C语言是如何工作 ?

C是一种编译语言。 编译器是一种特殊的工具,可以编译程序并将其转换为机器可读的目标文件。 编译过程完成后,链接器将合并不同的目标文件并创建一个可执行文件来运行该程序。 下图显示了“ C”程序的执行

C语言如何工作 ?
如今,各种编译器都可以在线使用,您可以使用任何这些编译器。 功能永远不变,大多数编译器将提供执行“ C”和“ C ++”程序所需的功能。

以下是在线可用的流行编译器列表:

  • lang编译器
  • MinGW编译器(适用于Windows的极简主义GNU)
  • 便携式“ C”编译器
  • Turbo C
Posted in C语言

发表评论

相关链接