C语言编程要点程序的编写和编译
运行C语言程序的步骤

运行C语言程序的步骤C语言是一种广泛应用于系统开发、嵌入式系统和游戏开发等领域的高级编程语言。
要成功运行C语言程序,需要经过以下几个步骤:1. 编写源代码首先,我们需要编写C语言程序的源代码。
源代码是用C语言编写的文本文件,其中包含了程序的逻辑和功能实现。
在编写源代码时,需要遵循C语言的语法规则,并利用各种控制结构、数据类型和函数等来实现所需的功能。
2. 预处理在编译源代码之前,需要对源代码进行预处理。
预处理器是一个程序,它负责处理源代码中的预处理指令,如宏定义、条件编译等。
预处理器会根据指令的要求对源代码进行处理,并生成一个经过预处理的文本文件。
3. 编译预处理完成后,我们需要使用编译器对预处理后的源代码进行编译。
编译器是将C语言源代码转换为机器语言的关键工具。
编译器会对源代码进行词法分析、语法分析、语义分析和代码生成等过程,最终生成可执行文件或目标文件。
4. 链接如果我们的程序中使用了外部函数、库文件或其他模块,编译器在编译过程中会生成对应的引用。
在链接阶段,链接器将这些引用与相应的函数或模块进行连接,生成最终的可执行文件。
链接器还会处理符号表、地址重定位和代码库等问题,确保程序能够正确地执行。
5. 运行程序生成可执行文件后,我们可以通过操作系统或命令行来运行程序。
在运行程序时,操作系统会为程序分配内存空间,并按照程序的指令依次执行。
程序会通过操作系统提供的接口来与计算机的各个部分进行交互,实现所需的功能和操作。
需要注意的是,编写和运行C语言程序时需要遵循一定的规范和约定。
例如,程序的入口函数通常命名为"main",并在程序开始时被调用;程序执行过程中可能会发生错误,我们需要合理地处理这些错误,以保证程序的稳定性和正确性。
总结起来,运行C语言程序的步骤包括编写源代码、预处理、编译、链接和最终的运行。
每个步骤都有其独特的功能和作用,只有经过这些步骤的处理,才能成功地将C语言程序转化为可执行文件,并在计算机上运行。
c语言程序的运行过程

c语言程序的运行过程C语言程序的运行过程C语言是一种广泛应用的编程语言,它的程序运行过程可以分为编译和执行两个阶段。
在编译阶段,源代码会被编译器转换为机器指令,生成可执行文件;在执行阶段,计算机会按照指令逐行执行程序。
我们需要编写C语言程序。
一个C语言程序通常由多个函数组成,其中必须包含一个main函数作为程序的入口点。
在main函数中,我们可以定义变量、调用其他函数以及执行各种操作。
接下来,我们需要使用编译器将源代码转换为可执行文件。
常用的C语言编译器有GCC、Clang等。
编译过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等步骤。
在这个过程中,编译器会检查代码的语法错误,并生成对应的目标代码。
在执行阶段,计算机会加载可执行文件到内存中,并按照顺序执行其中的指令。
首先,计算机会执行main函数中的第一条语句,然后按照程序的控制流逐行执行后续的语句。
在执行过程中,程序可以读取输入、进行计算、修改变量的值等操作。
C语言程序的执行过程中,还可能涉及到函数的调用。
当程序遇到函数调用语句时,会跳转到对应的函数代码,并执行函数中的语句。
函数调用完成后,程序会返回到调用函数的地方,继续执行后续的语句。
在程序执行过程中,我们还可以使用条件语句、循环语句等结构控制程序的流程。
条件语句根据特定条件的真假选择不同的执行路径,而循环语句可以重复执行一段代码,直到满足退出条件为止。
除了基本的语句和控制结构,C语言还提供了丰富的库函数供我们使用。
这些库函数可以完成各种功能,例如字符串操作、数学计算、文件操作等。
在程序中,我们可以通过包含对应的头文件来使用这些库函数。
C语言程序的运行过程中,还需要注意内存的分配和释放。
在程序执行过程中,会使用到不同类型的变量和数据结构,它们需要占用内存空间。
我们可以使用变量来存储和操作数据,而动态内存分配可以在程序运行时根据需要进行内存分配和释放。
在程序执行完成后,计算机会自动释放程序使用的资源,并终止程序的运行。
c语言程序设计大纲

c语言程序设计大纲以下是一个可能的C语言程序设计大纲:
1. 程序设计基础
- 程序设计概述
- 程序的编写、编译和执行过程
- C语言程序的基本结构
- 数据类型和变量
- 运算符和表达式
- 控制流程语句:顺序、选择、循环
2. 数组和字符串
- 数组的声明和初始化
- 多维数组
- 数组的遍历和访问
- 字符串的处理和操作
3. 函数和指针
- 函数的定义和调用
- 函数参数和返回值
- 递归函数
- 指针的基本概念
- 指针和数组的关系
- 指针和函数的关系
4. 结构和文件操作
- 结构的定义和使用
- 结构体作为函数参数和返回值
- 文件的打开、读写和关闭操作
- 文件指针和文件操作的错误处理
5. 动态内存管理
- 内存的分配和释放
- 使用malloc()和free()函数进行动态内存管理 - 内存泄漏和内存错误的预防和处理
6. 高级主题
- 位操作
- 枚举类型
- 预处理器指令
- 指针和函数指针
- 结构体和指针的高级应用
- 链表和递归
- 文件的随机访问
7. 编程实践和项目开发
- 程序设计实践和技巧
- 代码风格和规范
- 项目开发过程和团队合作
- 调试和测试技术
- 代码维护和改进。
C语言编译过程与运行机制

C语言编译过程与运行机制编程语言是计算机与人交流的桥梁,而C语言作为一种被广泛应用的高级编程语言,其编译过程与运行机制是每个C语言程序员必须了解的基本知识。
本文将深入探讨C语言编译过程以及程序的运行机制。
一、C语言编译过程C语言源代码是程序员用C语言编写的可读性较好的文本文件。
在进行C语言编译过程前,需要先了解一些基本概念和步骤。
1. 词法分析(Lexical Analysis)词法分析是编译器的第一个步骤,它将源代码分解为词法单元(Token)。
词法单元是源代码中的基本构造块,包括关键字、运算符、标识符、常量等。
例如,在下面这行代码中:```int x = 10;```词法分析会将其拆分为以下词法单元:```int、x、=、10、;```2. 语法分析(Syntax Analysis)语法分析是编译器的第二个步骤,它将词法单元组合成抽象语法树(Abstract Syntax Tree,简称AST)。
语法分析器根据编程语言的语法规则,来判断词法单元之间的关系和组合方式是否正确。
如果出现语法错误,编译器会给出相应的错误提示。
3. 语义分析(Semantic Analysis)语义分析阶段主要检查语法树的语义合法性。
它会检查变量使用是否合法、类型是否匹配等。
语义分析器会根据语言的规则进行类型检查,并生成符号表。
4. 中间代码生成(Intermediate Code Generation)中间代码生成阶段将抽象语法树翻译成中间代码,中间代码是一种与机器无关的低级语言。
常见的中间表示形式有三地址码、四元式等。
5. 代码优化(Code Optimization)代码优化是将中间代码进行一系列的优化处理,以提高程序的性能、减少资源的消耗等。
常见的优化手段包括删除冗余代码、循环展开、常量传播等。
6. 目标代码生成(Code Generation)目标代码生成阶段将优化后的中间代码翻译成特定机器的目标代码。
目标代码与计算机体系结构相关,可以是机器码、汇编代码等。
c语言运行的步骤

C语言运行的步骤C语言是一种通用的高级编程语言,广泛应用于系统软件、嵌入式系统和游戏开发等领域。
在学习和使用C语言时,了解其运行的步骤是非常重要的。
本文将详细介绍C语言程序从源代码到最终执行的过程。
1. 编写源代码C语言程序的第一步是编写源代码。
源代码是以ASCII文本形式编写的,可以使用任何文本编辑器来创建。
C语言程序由一系列的语句组成,每个语句以分号结尾。
以下是一个简单的C语言程序示例:#include <stdio.h>int main() {printf("Hello, World!");return 0;}上述程序使用了标准库函数printf打印出”Hello, World!“。
main函数是每个C 程序的入口点,程序从这里开始执行。
2. 预处理在将源代码编译成可执行文件之前,需要进行预处理。
预处理器会对源代码进行一系列的处理,如宏展开、文件包含等。
预处理器指令以#开头,并且不以分号结尾。
常见的预处理指令有#include、#define等。
在上述示例中,#include <stdio.h>指令用于包含标准输入输出库。
3. 编译编译是将源代码转换为机器代码的过程。
编译器会对源代码进行词法分析、语法分析和语义分析,生成相应的中间代码。
C语言有许多不同的编译器可供选择,如GCC、Clang等。
可以使用命令行工具或集成开发环境(IDE)来进行编译。
以下是使用GCC编译器进行编译的命令:gcc -o hello hello.c上述命令将hello.c源文件编译为可执行文件hello。
4. 链接链接是将各个模块(对象文件)合并成一个可执行文件的过程。
在C语言程序中,通常会使用到其他函数库,例如标准库函数。
链接器会解析函数调用,并将其与实际的函数定义相连接。
如果程序中使用到了未定义的函数或变量,链接过程会报错。
在上述示例中,需要链接标准库函数printf,以及C运行时库等。
C语言编译过程总结详解

C语言编译过程总结详解C语言编译过程总结详解链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。
编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。
链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。
过程图解如下:从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。
编译过程编译过程又可以分成两个阶段:编译和会汇编。
编译编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段:第一个阶段是预处理阶段,在正式的编译阶段之前进行。
预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。
如#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中。
这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。
一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。
在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。
主要是以下几方面的处理:(1)宏定义指令,如 #define a b对于这种伪指令,预编译所要做的是将程序中的所有a用b替换,但作为字符串常量的 a则不被替换。
还有 #undef,则将取消对某个宏的定义,使以后该串的出现不再被替换。
(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。
这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。
预编译程序将根据有关的文件,将那些不必要的代码过滤掉。
(3) 头文件包含指令,如#include "FileName"或者#include 等。
c语言运行流程

c语言运行流程C语言是一种广泛应用于系统开发和嵌入式编程的计算机编程语言。
它以其高效性、可移植性和灵活性而受到广泛认可。
要理解C语言的运行流程,我们需要了解编译、连接和执行这三个主要的步骤。
一、编译编译是将源代码转换为机器可执行代码的过程。
C语言的源代码以.c文件的形式存在。
编译器是将源代码中的C语句转换为低级机器指令的工具,使计算机能够理解和执行这些指令。
编译的过程可以分为以下几个步骤:1. 词法分析:编译器会扫描源代码,将其分解为一个个的语法单元或记号,如变量名、关键字、标点符号等。
2. 语法分析:编译器将词法分析得到的记号按照C语言的语法规则进行组织,并生成一个语法树。
3. 语义分析:编译器在语法树的基础上进行语义检查,确保源代码的合法性和准确性。
4. 中间代码生成:编译器将语法树转换为中间代码,中间代码是一种介于源代码和目标代码之间的表示形式。
5. 优化:编译器对中间代码进行优化,以提高程序的效率和性能。
6. 目标代码生成:编译器将优化后的中间代码转换为特定机器的目标代码,目标代码是机器可执行的二进制指令。
二、连接连接是将编译生成的目标代码与库文件进行合并,以生成最终的可执行文件。
连接器是负责这一任务的工具。
连接的过程可以分为以下几个步骤:1. 符号解析:连接器会解析目标代码中使用的外部符号,找到其定义所在的库文件。
2. 符号重定位:连接器会将目标代码中使用的外部符号的引用替换为实际地址。
3. 地址解析:连接器将目标代码中的逻辑地址转换为物理地址。
4. 符号表生成:连接器会生成一个符号表,记录了目标代码中定义和使用的符号信息。
5. 重定位表生成:连接器会生成一个重定位表,用于在程序执行过程中动态调整符号的地址。
三、执行执行是将最终生成的可执行文件加载到内存中,并进行执行的过程。
操作系统是负责管理和控制这一过程的。
执行的过程可以分为以下几个步骤:1. 内存分配:操作系统将可执行文件的代码和数据加载到内存中的合适位置。
C语言如何编译与运行程序

C语言如何编译与运行程序C语言是一种高级编程语言,可以通过编译和运行来执行C代码。
编译是将C代码转换为可以计算机理解的二进制形式的过程,而运行是指执行这个编译生成的二进制文件。
在C语言中,编译和运行程序可以通过以下几个步骤完成:2.保存代码文件:完成编写代码后,需要将代码保存为.c文件。
可以选择所在的位置和文件名。
3. 打开终端:在编译和运行C代码之前,需要打开终端窗口。
终端窗口是执行命令行操作的界面。
在Windows系统中,可以通过按下Win + R键,然后输入"cmd",然后按回车键来打开命令提示符窗口。
在Mac OS 和Linux系统中,可以通过在启动程序或按下Ctrl + Alt + T键来打开终端。
4. 切换目录:在终端窗口中,需要使用"cd"命令切换到保存C代码的目录。
例如,如果代码保存在D:\MyCode目录中,则可以在终端中输入以下命令:```cd D:\MyCode```5.编译代码:在切换到代码所在目录后,输入以下命令编译代码:```gcc -o program 文件名.c这里的"gcc"是编译器的命令,"-o program"是可执行文件的输出指令,"文件名.c"是要编译的C代码文件。
例如,如果要编译名为"hello.c"的代码文件,则可以输入以下命令:```gcc -o hello hello.c```在编译成功后,会生成名为"hello"的可执行文件。
注意:如果没有安装gcc编译器,需要先安装gcc编译器。
在Linux 系统中,可以使用以下命令来安装gcc:```sudo apt-get install build-essential```6.运行程序:在成功编译C代码后,可以在终端窗口中输入以下命令来运行程序:```./程序名```例如,如果编译生成的可执行文件名为"hello",则可以输入以下命令来运行程序:./hello```在运行程序后,终端窗口将显示程序输出的结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言编程要点程序的编写和编译Document serial number【LGGKGB-LGG98YT-LGGT8CB-LGUT-C语言编程要点---第18章程序的编写和编译第18章程序的编写和编译本章讲述在编译程序时可以使用的一些技术。
在本章中,你将学到专业C程序员在日常编程中所使用的一些技巧。
你将会发现,无论是对小项目还是大项目,把源代码分解成几个文件都是很有益处的。
在生成函数库时,这一点更为重要。
你还将学到可以使用的各种存储模式以及怎样为不同的项目选择不同的存储模式。
如果你的程序是由几个源文件组成的,那么你可以通过一个叫MAKE的工具来管理你的项目(project)。
你还将学到“.COM"文件和".EXE"文件的区别以及使用“.COM”文件的一个好处。
此外,你还将学到用来解决一个典型的DOS问题的一些技巧,这个问题就是“没有足够的内存来运行DOS程序”。
本章还讨论了扩展内存、扩充内存、磁盘交换区、覆盖管理程序和DOS扩展程序的用法,提出了解决"RAM阻塞”这一问题的多种方法,你可以从中选择一种最合适的方法. 程序是应该写成一个源文件还是多个源文件?如果你的程序确实很小又很紧凑,那么当然应该把所有的源代码写在一个“.C”文件中。
然而,如果你发现自己编写了许多函数(特别是通用函数),那么你就应该把程序分解成几个源文件(也叫做模块)。
把一个程序分解成几个源文件的过程叫做模块化程序设计(modular programming)。
模块化程序设计技术提倡用几个不同的结构紧凑的模块一起组成一个完整的程序。
例如,如果一个程序中有几种实用函数、屏幕函数和数据库函数,你就可以把这些函数分别放在三个源文件中,分别组成实用模块、屏幕模块和数据库模块。
把函数放在不同的文件中后,你就可以很方便地在其它程序中重复使用那些通用函数。
如果你有一些函数还要供其它程序员使用,那么你可以生成一个与别人共享的函数库(见18.9)。
你永远不必担心模块数目“太多”——只要你认为合适,你可以生成很多个模块。
一条好的原则就是保持模块的紧凑性.即在同一个源文件中只包含那些在逻辑上与其相关的函数。
如果你发现自己把几个没有关系的函数放在了同一个源文件中,那么最好停下来检查一下程序的源代码结构,并且对模块做一下逻辑上的分解。
例如,如果要建立一个通信管理数据库,你可能需要有这样一个模块结构:---------------------------------------------------------模块名内容---------------------------------------------------------Main.c maln()函数Screen.c 屏幕管理函数Menus.c 菜单管理函数Database.c 数据库管理函数Utility.c 通用功能函数Contact.c 通信处理函数Import.c 记录输入函数Export.c 记录输出函数Help.c 联机帮助支持函数----------------------------------------------------------请参见:18.10 如果一个程序包含多个源文件,怎样使它们都能正常工作?. 各种存储模式之间有什么区别?DOS用一种段地址结构来编址计算机的内存,每一个物理内存位置都有一个可通过段地址一偏移量的方式来访问的相关地址。
为了支持这种段地址结构,大多数C编译程序都允许你用以下6种存储模式来创建程序:-----------------------------------------------------------------------存储模式限制所用指针-----------------------------------------------------------------------Tiny(微) 代码、数据和栈一64KB NearSmall(小) 代码一64KB Near数据和栈一64KB NearMedium(中) 代码一1MB Far数据和栈一64KB NearCompact(紧缩) 代码一64KB Near数据和栈一1MB FarLarge(大) 代码一1MB Far数据和栈一1MB FarHuge*(巨) 代码一1MB Far数据和栈一1MB Far-----------------------------------------------------------------------*注意:在Huge存储模式下,静态数据(如数组)可以超过64KB,这在其它存储模式下都不行。
Tiny存储模式的限制很严(所有的代码、数据和栈都被限制在64KB中),它通常用来生成"COM"文件。
由于内存地址的“安排”方式的限制,Huge模式会带来显着的性能损失,因此它很少被使用。
请参见:18.3 最常使用的存储模式有哪些?18.4 应该使用哪种存储模式?. 最常使用的存储模式有哪些?最常使用的存储模式有Small,Medium和Large这几种。
Tiny存储模式一般只用来生成".COM"文件,在现在的高性能计算机上,它已很少被使用了。
Compact存储模式允许程序有很少的代码和大量的数据,在今天的商业应用环境中,它同样也不常用了。
由于Huge存储模式的存储地址机制导致它的效率较低,所以它也很少被使用。
一般说来,你应该根据程序的大小选用Small,Medium或Large中的一种存储模式。
对一个小的实用程序来说,Small存储模式可能是最合适的,这种存储模式允许有64KB的代码和64KB数据和栈。
如果程序有更大一些的数据要求,你可以使用Medium存储模式,它允许程序有多达1MB的可寻址数据空间。
对于更大的程序,你应该使用Large存储模式,它允许程序有1MB的代码和1MB的数据和栈空间。
如果你在编写一个Windows程序或者在使用一个32位编译程序,那么你最好使用Small存储模式,因为这样的环境并不受DOS程序的段地址结构的限制。
请参见:18.2 各种存储模式之间有什么区别?18.4 应该使用哪种存储模式?. 应该使用哪种存储模式?如果要生成一个“.COM”文件,必须使用Tiny存储模式,即所有的代码、数据和栈空间都被限制在64KB中。
小的实用程序普遍使用这种存储模式。
相对较小的程序也可以使用Small存储模式,只不过不必把整个程序都限制在64KB中。
在Small存储模式下,有64KB的代码空间和64KB的数据和栈空间。
除了用于小程序外,Small存储模式还可用在Windows或32位编译程序这样的环境中,因为在这些环境中内存寻址并不受DOS中16位的限制。
如果一个程序的代码量相对较大而静态数据量相对较小,你可以用Medium存储模式来创建程序。
如果程序很大(需要很多模块,大量的代码和数据),那么你应该选用Large存储模式,这种存储模式常用在DOS下编写商用软件。
与Small,Medium和Large存储模式相比,Compact和Huge存储模式要少用得多。
Cornpact存储模式允许程序有大量的静态数据和相对较少(64KB或更少)的代码。
满足这种模式的程序很少,常常是一些转移程序,它们有大量必须存到内存中的静态转移表。
Huge存储模式与Large存储模式基本相同,只是Huge存储模式允许程序有超过64KB的静态数据。
与Compact存储模式相似,Huge存储模式也很少被使用,这主要是因为它会带来显着的性能损失。
由于Huge存储模式的执行效率较低,因此你应该避免使用这种模式,除非你确实需要超过64KB的一个数组或其它静态数据。
记住,数组和其它程序结构可通过malloc()和calloc()在程序运行时进行动态分配,它们在本质上并不必须是静态的。
请参见:18.2各种存储模式之间有什么区别?18.3最常使用的存储模式有哪些?. 怎样生成一个“.COM”文件?生成一个“.COM”文件是指用Tiny存储模式编译程序,并用特殊的连接命令产生扩展名为".COM"而不是".EXE"的文件。
记住,如果要使一个程序成为一个“.COM”文件,那么所有的代码、数据和栈都必须限制在64KB之内。
这种存储模式通常只被一些很小的程序使用,例如TSR程序和小的实用程序。
每个编译程序生成“.COM”文件的方法都是不同的,你应该在编译程序手册中查找有关信息,以了解哪些编译选项或连接选项是用来生成".COM"文件而不是".EXE"文件的。
请参见:18.6“.COM”文件有哪些地方优于“.EXE"文件?. “.COM”文件有哪些地方优于“.EXE”文件?一个“.COM”文件的所有代码、数据和栈都被限制在64KB之内,因此,它只能用在一些小的应用中,例如实用程序和TSR程序(终止并驻留程序)。
“.COM”文件的一个明显优点就是它的装入要比“.EXE"文件快得多。
“.COM”文件也被称作“内存映象”文件,因为它可以直接装入内存,不需要任何“处理”。
“.EXE"文件中包含了由连接程序插入到其它文件头中的一些特殊的组装指令,这些指令中包括一个用来管理可执行程序的不同部分的重定位表。
“.COM”文件中不包含任何这样的指令或重定位表,因为整个程序可以装入64KB的内存空间中。
因此,DOS不必去分析任何组装指令,“.COM”文件的装入速度也就比".EXE"文件快。
“.COM”文件通常很简单,因此它们所能实现的功能也就受到限制。
例如,你不能在“.COM”文件中从远程堆中分配内存。
请参见:18.5怎样生成一个“.COM”文件?. 当一个库被连接到目标上时,库中的所有函数是否都会被加到一个".EXE"文件中?不会。
当启动连接程序时,它会寻找“未定义的外部函数”,也就是说,它将在每一个库文件中查找源代码文件中未定义的函数。
当它找到一个未定义的外部函数后,它会引入包含该函数定义的目标代码。
(obj)。
不幸的是,如果这个函数是在一个包含其它函数定义的源文件中被编译的话,那么这些函数也会被包含进来,你的可执行代码中将包含一些不需要的代码。
因此,将库函数放到各自的源文件中是很重要的——否则会浪费宝贵的程序空间。
有些编译程序包含特殊的“精明的”连接程序,这些连接程序能查出不需要的函数并去掉它们,从而使这些函数不再进入你的程序。
下面举一个例子:假设有两个源文件,分别为libfunc1.c和libfunc2.c,它们所包含的函数都要被放到一个库中。