C语言条件编译及编译预处理阶段
C语言文件的编译到执行的四个阶段

C语言文件的编译到执行的四个阶段1.预处理阶段:预处理是在编译之前进行的,它主要处理源代码中的预处理指令,如#include、#define和#ifdef等。
预处理器会根据这些指令对源代码进行替换、扩展和删除等操作,最终生成一个经过预处理的源文件。
预处理的主要作用是处理条件编译、头文件包含、宏定义和宏替换等操作。
预处理阶段的过程如下:- 首先,预处理器读取源文件中的指令,如#include和#define等。
-然后,预处理器会根据指令对源文件进行相应操作,如包含头文件和替换宏定义等。
-最后,预处理器生成一个经过预处理的源文件,该文件中已经展开了所有的宏定义和包含的头文件。
2.编译阶段:编译是将经过预处理的源文件翻译成汇编语言的过程。
编译器将源文件中的代码分析语法、语义错误,并生成对应的汇编代码。
此外,编译器还会进行优化操作,如去除死代码、常量替换和寄存器分配等。
编译阶段的过程如下:-首先,编译器会对预处理得到的源文件进行语法和语义检查,以发现其中的错误。
-然后,编译器会将源代码翻译为汇编语言,即将高级语言代码转换为机器码指令的中间表示。
-最后,编译器将生成的汇编代码保存为目标文件,该文件包含了机器码指令和相关的符号表信息。
3.汇编阶段:汇编是将编译阶段输出的汇编代码翻译成可执行文件的过程。
汇编器将汇编代码转换为可重定位机器码,并生成与目标平台相关的二进制文件。
可重定位机器码是指依赖于加载器和链接器进行地址重定位的代码。
汇编阶段的过程如下:-首先,汇编器将目标文件中的汇编指令逐条转换为机器码指令,并生成与目标平台相关的二进制代码。
-汇编器还会生成与目标文件相关的符号表,用于链接阶段的符号解析。
-最后,汇编器将生成的目标文件保存为可执行文件的一部分,该文件包含了机器码指令和相关的符号表信息。
4.链接阶段:链接是将多个目标文件合并成一个可执行文件的过程。
链接器会将目标文件中的符号引用与符号定义进行匹配,并解析符号引用,使其指向正确的内存地址。
运行C语言程序的步骤

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

c语⾔的预处理指令分3种 1宏定义 2条件编译 3⽂件包含宏简介1.C语⾔在对源程序进⾏编译之前,会先对⼀些特殊的预处理指令作解释(⽐如之前使⽤的#include⽂件包含指令),产⽣⼀个新的源程序(这个过程称为编译预处理),之后再进⾏通常的编译所有的预处理指令都是以#开头,并且结尾不⽤分号2.预处理指令分3种 1> 宏定义 2> 条件编译 3> ⽂件包含3.预处理指令在代码翻译成0和1之前执⾏4.预处理的位置是随便写的5.预处理指令的作⽤域:从编写指令的那⼀⾏开始,⼀直到⽂件结尾,可以⽤#undef取消宏定义的作⽤6.宏名⼀般⽤⼤写或者以k开头,变量名⼀般⽤⼩写 宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。
⼀、不带参数的宏定义1.⼀般形式#define 宏名字符串⽐如#define ABC 10右边的字符串也可以省略,⽐如#define ABC2.作⽤它的作⽤是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常⽤来定义常量.3.使⽤习惯与注意1> 宏名⼀般⽤⼤写字母,以便与变量名区别开来,但⽤⼩写也没有语法错误2> 对程序中⽤双引号扩起来的字符串内的字符,不进⾏宏的替换操作。
3> 在编译预处理⽤字符串替换宏名时,不作语法检查,只是简单的字符串替换。
只有在编译的时候才对已经展开宏名的源程序进⾏语法检查4> 宏名的有效范围是从定义位置到⽂件结束。
如果需要终⽌宏定义的作⽤域,可以⽤#undef命令5> 定义⼀个宏时可以引⽤已经定义的宏名#define R 3.0#define PI 3.14#define L 2*PI*R#define S PI*R*R举例1 #include <stdio.h>2#define COUNT 434int main()5 {6char *name = "COUNT";78 printf("%s\n", name);910int ages[COUNT] = {1, 2, 67, 89};1112#define kCount 41314for ( int i = 0; i<COUNT; i++) {15 printf("%d\n", ages[i]);16 }1718// 从这⾏开始,COUNT这个宏就失效19#undef COUNT2021//int a = COUNT 写这个报错2223return0;24 }⼆、带参数的宏定义1.⼀般形式#define 宏名(参数列表) 字符串2.作⽤在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数⽤宏名右边参数列表中的参数替换3.使⽤注意1> 宏名和参数列表之间不能有空格,否则空格后⾯的所有字符串都作为替换的字符串2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进⾏任何计算操作。
c语言程序基本结构

C语言程序基本结构一、概述C语言是一种面向过程的程序设计语言,被广泛应用于系统软件、驱动程序、嵌入式系统等领域。
了解C语言程序的基本结构对于学习和开发C语言程序至关重要。
本文将详细介绍C语言程序的基本结构,包括文件组成、预处理、函数和变量声明、主函数等方面。
二、C语言程序文件组成C语言程序通常由多个文件组成,每个文件具有特定的功能和作用。
下面是C语言程序常见的文件类型:1.源文件(.c):包含C语言源代码的文件,用于编写程序的具体逻辑。
2.头文件(.h):包含函数声明、宏定义、结构体定义等内容的文件,用于引用外部函数和变量。
3.库文件(.lib/.a/.dll/.so):包含了已经编译好的目标代码,用于链接到程序中使用。
三、C语言程序的预处理在编译阶段之前,C语言程序需要进行预处理,即对源代码进行宏替换、文件包含等操作。
预处理的结果是生成了经过宏替换和文件包含后的代码。
预处理指令由#开头,常见的预处理指令包括:1.宏定义(#define):用于定义常量、宏函数等。
#define PI 3.1415926#define MAX(a, b) ((a) > (b) ? (a) : (b))2.文件包含(#include):用于引入头文件。
#include <stdio.h>#include "utility.h"3.条件编译(#if / #ifdef / #ifndef / #endif):用于根据条件选择编译代码块。
#ifdef DEBUGprintf("Debug mode\n");#elseprintf("Release mode\n");#endif四、函数和变量声明在C语言程序中,函数和变量的声明是非常重要的一部分。
函数声明包括函数名、参数列表和返回值类型,用于告诉编译器函数的存在及其使用方式。
变量声明用于定义变量及其类型。
c语言build的用法

C语言build的用法1. 什么是Build在软件开发中,Build(构建)是指将源代码转换为可执行文件或库的过程。
在C语言中,Build通常包括了编译、链接和打包等步骤。
2. 编译过程编译是将源代码转换为机器可执行的中间代码或目标代码的过程。
C语言的编译过程通常分为预处理、编译和汇编三个阶段。
2.1 预处理(Preprocessing)预处理阶段通过预处理器对源文件进行处理,主要完成以下任务:•头文件包含:将#include指令替换为对应头文件的内容。
•宏替换:将宏定义替换为实际的表达式。
•条件编译:根据条件判断指令(如#ifdef、#ifndef)决定是否编译某段代码。
•去除注释:删除注释内容。
预处理后生成一个没有宏定义和条件编译指令,并且已经包含了所有头文件内容的源文件。
2.2 编译(Compiling)编译阶段将预处理后的源文件翻译成汇编语言或机器码。
这个阶段主要完成以下任务:•词法分析:将源代码分解成一个个单独的词法单元。
•语法分析:根据语法规则构建语法树。
•语义分析:检查代码是否符合语言规范,如类型匹配、变量声明等。
•中间代码生成:将源代码转换为中间代码,如LLVM IR(Intermediate Representation)。
2.3 汇编(Assembling)汇编阶段将汇编语言翻译成机器码。
这个阶段主要完成以下任务:•符号解析:将汇编指令中的符号(如函数名、变量名)与其对应的存储地址关联起来。
•生成可重定位目标文件:将汇编指令翻译成机器码,并生成可重定位目标文件(Object File)。
可重定位目标文件包含了机器码和相关的符号信息。
3. 链接过程链接是将多个目标文件和库文件合并成一个可执行文件或库的过程。
C语言的链接过程通常分为静态链接和动态链接两种方式。
3.1 静态链接(Static Linking)静态链接是在Build过程中将所有依赖的目标文件和库文件合并到最终的可执行文件或库中。
C语言文件的编译到执行的四个阶段

C语言文件的编译到执行的四个阶段C语言程序的编译到执行过程可以分为四个主要阶段:预处理、编译、汇编和链接。
1.预处理:在这个阶段,编译器会执行预处理指令,将源代码中的宏定义、条件编译和包含其他文件等操作进行处理。
预处理器会根据源代码中的宏定义替换相应的标识符,并去除注释。
预处理器还会将包含的其他文件插入到主文件中,并递归处理这些文件。
处理后的代码被称为预处理后的代码。
2.编译:在这个阶段,编译器将预处理后的代码转换成汇编代码。
汇编代码是一种低级的代码,使用符号来表示机器指令。
编译器会对源代码进行词法分析、语法分析和语义分析,生成相应的中间代码。
中间代码是一种与特定硬件无关的代码表示形式,便于后续阶段的处理。
3.汇编:在这个阶段,汇编器将中间代码转化为机器可以执行的指令。
汇编器会将汇编代码翻译成二进制形式的机器指令,并生成一个目标文件。
目标文件包含了机器指令的二进制表示以及相关的符号信息。
4.链接:在C语言中,程序通常由多个源文件组成,每个源文件都经过了预处理、编译和汇编阶段得到目标文件。
链接器的作用就是将这些目标文件合并成一个可执行文件。
链接器会解析目标文件中的符号引用,找到其对应的定义并进行连接。
链接器还会处理库文件,将使用到的函数和变量的定义从库文件中提取出来并添加到目标文件中。
最终,链接器生成一个可以直接执行的可执行文件。
以上是C语言程序从编译到执行的四个阶段。
每个阶段都有特定的任务,并负责不同层次的代码转换和处理。
通过这四个阶段,C语言程序可以从源代码转换为机器能够执行的指令,并最终被计算机执行。
c语言windows编译过程

c语言windows编译过程
在Windows操作系统上,使用C语言进行编译的过程主要包括以下几个步骤:
1. 编写源代码:使用文本编辑器编写C语言源代码文件,扩展名为.c。
2. 预处理:使用预处理器对源代码进行处理,包括宏展开、头文件包含、条件编译等。
预处理器生成的文件通常具有扩展名为.i。
3. 编译:使用编译器将预处理后的源代码翻译成汇编代码。
编译器生成的文件通常具有扩展名为.asm。
4. 汇编:使用汇编器将汇编代码翻译成机器码。
汇编器生成的文件通常具有扩展名为.obj。
5. 链接:使用链接器将多个目标文件(.obj)以及所需的库文件进行链接,生成可执行文件。
链接器生成的文件通常具有扩展名为.exe。
在Windows上,可以使用多种工具进行C语言的编译,最常用的是Microsoft Visual Studio(包含了Visual C++编译器)和MinGW (包含了GCC编译器)。
在使用Visual Studio进行编译时,可以通过IDE界面进行操作,也可以使用命令行工具(如cl.exe)执行编译命令。
在使用MinGW进行编译时,一般使用命令行工具(如gcc.exe)执行编译命令。
编译命令的具体参数可以根据需要进行设置,如指定源代码文件、输出文件名、链接的库文件等。
需要注意的是,编译过程中可能会出现一些错误或警告信息,需要根据编译器的提示进行修改和调试。
c语言的条件编译

c语言的条件编译
条件编译是指在程序编译时根据一定的条件来选择不同的代码执行路径,可以根据平台不同、功能模块不同以及编译选项不同等条件进行判断和选择,从而使得程序可以适应不同的环境和需求。
在C语言中,条件编译是通过预处理指令 #ifdef、#ifndef、#else、#endif 等来实现的。
这些指令的基本用法如下:
ifdef 宏名
/* 常规代码块 */
endif
ifndef 宏名
/* 常规代码块 */
endif
ifdef 某个宏名
/* 某段代码 */
else
/* 另外一段代码 */
endif
如果在程序中定义了宏名,则 #ifdef 指令之后到 #endif 指令之间的代码将被编译;否则这些代码将被忽略。
如果在程序中未定义宏名,则 #ifndef 指令之后到 #endif 指令之间的代码将被编译;否则这些代码将被忽略。
如果程序中定义了某个宏名,则 #ifdef 指令之后到 #else 指令之间的代码将被编译;否则 #else 指令之后到 #endif 指令之间的代码将被编译。
#else 指令可以看作是一个“否则”的标志。
通过条件编译,我们可以根据需要选择不同的代码路径,以实现在不同条件下的程序功能,提高程序的灵活性和可移植性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言条件编译及编译预处理阶段一、C语言由源代码生成的各阶段如下:C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件其中编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。
或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。
预处理过程先于编译器对源代码进行处理。
在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。
要完成这些工作,就需要使用预处理程序。
尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。
预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。
预处理过程还会删除程序中的注释和多余的空白字符。
二、伪指令(或预处理指令)定义预处理指令是以#号开头的代码行。
#号必须是该行除了任何空白字符外的第一个字符。
#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。
整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
下面是部分预处理指令:指令用途# 空指令,无任何效果#include 包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef 如果宏已经定义,则编译下面代码#ifndef 如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是elseif的简写#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息三、预处理指令主要包括以下四个方面:1、宏定义指令宏定义了一个代表特定内容的标识符。
预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。
宏最常见的用法是定义代表某个值的全局符号。
宏的第二种用法是定义带参数的宏(宏函数),这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。
1.1 #define指令1.1.1 #define预处理指令用来定义宏。
该指令最简单的格式是:声明一个标识符,给出这个标识符代表的代码(比如像圆周率这样的数)。
在后面的源代码中,我们就可以使用定义的宏取代要使用的代码,举例如下://例1#define MAX_NUM 10int array[MAX_NUM];for(i=0;i<MAX_NUM;i++)在这个例子中,对于阅读该程序的人来说,符号MAX_NUM就有特定的含义,它代表的值给出了数组所能容纳的最大元素数目。
程序中可以多次使用这个值。
作为一种约定,习惯上总是全部用大写字母来定义宏,这样易于把程序的宏标识符和一般变量标识符区别开来。
如果想要改变数组的大小,只需要更改宏定义并重新编译程序即可。
1.1.2 使用宏的好处有两点:一是使用方便。
如下://例2#define PAI 3.1415926PAI显然比3.1415926写着方便。
二是定义的宏有了意义,可读性强。
如例1,MAX_NUM,望文生意便知是最大数量的意思,比单纯使用10这个数字可读性要强的多。
三是容易修改。
如例1,如果在程序中有几十次会使用到MAX_NUM,修改只需要在宏定义里面修改一次就可以,否则你会修改到崩溃。
1.1.3 宏表示的值可以是一个常量表达式,允许宏嵌套(必须在前面已定义)。
例如://例3#define ONE 1#define TWO 2#define SUM(ONE+TWO)这里需要注意两点:一是注意上面的宏定义使用了括号。
尽管它们并不是必须的。
但出于谨慎考虑,还是应该加上括号的。
例如:six=THREE*TWO;预处理过程把上面的一行代码转换成:six=(ONE+TWO)*TWO;如果没有那个括号,就转换成:six=ONE+TWO*TWO;了。
也就是说预处理仅是简单的字符替换,要时刻注意这一点,很多错误都会因此出现。
二是虽然我们举例用了#define ONE 1 这个例子,但是一般要求宏定义要有其实际意义,#define ONE 1这种没意义的宏定义是不推荐的。
(大概是这么个意思,忘记具体怎么说了)1.1.4 宏还可以代表一个字符串常量,例如:#define VERSION "Version 1.0 Copyright(c) 2003"1.2 带参数的#define指令(宏函数)带参数的宏和函数调用看起来有些相似。
看一个例子://例4#define Cube(x) (x)*(x)*(x)可以时任何数字表达式甚至函数调用来代替参数x。
这里再次提醒大家注意括号的使用。
宏展开后完全包含在一对括号中,而且参数也包含在括号中,这样就保证了宏和参数的完整性。
看一个用法://例4用法int num=8+2;volume=Cube(num);展开后为(8+2)*(8+2)*(8+2);如果没有那些括号就变为8+2*8+2*8+2了(切记)。
下面的用法是不安全的:volume=Cube(num++);如果Cube是一个函数,上面的写法是可以理解的。
但是,因为Cube是一个宏,所以会产生副作用。
这里的书写不是简单的表达式,它们将产生意想不到的结果。
它们展开后是这样的:volume=(num++)*(num++)*(num++);很显然,结果是10*11*12,而不是10*10*10;那么怎样安全的使用Cube宏呢?必须把可能产生副作用的操作移到宏调用的外面进行:int num=8+2;volume=Cube(num);num++;宏函数使用不当会出现一些难以发现的错误,请慎重使用。
1.3 #运算符出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。
有时把这种用法的#称为字符串化运算符。
例如://例5#define PASTE(n) "adhfkj"#nint main(){printf("%s\n",PASTE(15));return0;}//输出adhfj15宏定义中的#运算符告诉预处理程序,把源代码中任何传递给该宏的参数转换成一个字符串。
所以输出应该是:adhfkj15。
1.4 ##运算符(很少用)##运算符用于把参数连接到一起。
预处理程序把出现在##两侧的参数合并成一个符号。
看下面的例子://例6#define NUM(a,b,c) a##b##c#define STR(a,b,c) a##b##cint main(){printf("%d\n",NUM(1,2,3));printf("%s\n",STR("aa","bb","cc"));return0;}//最后程序的输出为:123aabbcc2、条件编译指令。
程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。
条件编译指令将决定那些代码被编译,而哪些是不被编译的。
可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。
(条件编译为了提高程序的可移植性,增加程序的灵活性。
便于程序在不同的软硬件环境下都可正常运行而不需要修改程序。
比如说一个商业软件,面向的是不同的硬件系统和软件系统,如果移植性不好,那卖出去的软件在每个环境下都要单独设置,那软件公司的开发人员每天都要做这样的修改程序的工作,会影响正常的工作。
所以对需要的部分进行条件编译,可以大大降低软件需要改动的部分或者不改动。
举个例子,你如果将一个函数声明2次,编译器就会报错。
所以把函数声明写在头文件中后,如果引用了2次这个头文件,也会报错。
#ifndef #define 宏就是用来避免头文件重复包含的,意思是如果没有这个定义,就定义下面的内容。
条件编译是为了代码能在不同的环境中都编译通过,通用性更好。
)2.1 #if/#endif/#else/#elif指令#if指令检测跟在制造另关键字后的常量表达式。
如果表达式为真,则编译后面的代码,直到出现#else、#elif或#endif为止;否则就不编译。
#endif用于终止#if预处理指令。
#else指令用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码。
//例7#define DEBUG //此时#ifdef DEBUG为真//#define DEBUG 0 //此时为假int main(){#ifdef DEBUGprintf("Debugging\n");#elseprintf("Not debugging\n");#endifprintf("Running\n");return0;}这样我们就可以实现debug功能,每次要输出调试信息前,只需要#ifdef DEBUG判断一次。
不需要了就在文件开始定义#define DEBUG 0#elif预处理指令综合了#else和#if指令的作用。
//例8#define TWOint main(){#ifdef ONEprintf("1\n");#elif defined TWOprintf("2\n");#elseprintf("3\n");#endif}//输出结果是2。
2.2 #ifdef和#ifndef这二者主要用于防止重复包含。
我们一般在.h头文件前面加上这么一段://头文件防止重复包含//funcA.h#ifndef FUNCA_H#define FUNCA_H//头文件内容#end if这样,如果a.h包含了funcA.h,b.h包含了a.h、funcA.h,重复包含,会出现一些type redefination 之类的错误。
#if defined等价于#ifdef; #if !defined等价于#ifndef3、头文件包含指令。
采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。
因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。
预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。
#include预处理指令的作用是在指令处展开被包含的文件。
包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。
标准C编译器至少支持八重嵌套包含。
预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含,这个的处理办法上面已经给出。
在程序中包含头文件有两种格式:#include <my.h>#include "my.h"第一种方法是用尖括号把头文件括起来。