第6讲-预处理和多模块编程
Python模块化编程

Python模块化编程:构建高效、可维护的代码基石在Python编程的广阔世界中,模块化编程是提升代码质量、促进团队协作、以及实现复杂项目可维护性的关键所在。
本文旨在深入探讨Python模块化编程的概念、原理、实践方法,并通过丰富的案例和代码示例,帮助初学者及进阶开发者掌握这一重要技能。
一、模块化编程概述1.1 什么是模块化编程?模块化编程是一种将大型程序分解为一系列小型、独立、可复用的代码块(称为模块)的过程。
每个模块负责完成特定的功能或任务,并通过定义良好的接口与其他模块进行交互。
这种编程方式有助于减少代码冗余、提高代码的可读性和可维护性,同时也便于团队协作和代码复用。
1.2 Python中的模块在Python中,模块可以是Python文件(.py文件),也可以是预先编译的共享库或C 语言扩展。
Python标准库提供了大量的模块,涵盖了从文件操作到网络编程、从数据处理到图形界面开发等各个方面。
此外,开发者还可以根据自己的需求创建自定义模块。
二、Python模块的基本操作2.1 导入模块Python提供了多种导入模块的方式,最基本的是使用import语句。
例如,要导入Python 标准库中的math模块,可以这样做:python复制代码import mathprint(math.sqrt(16)) # 输出4.0也可以使用from...import...语句从模块中导入特定的函数或类:python复制代码from math import sqrtprint(sqrt(16)) # 输出4.02.2 创建和使用自定义模块创建自定义模块非常简单,只需将Python代码保存在一个.py文件中即可。
然后,在其他Python文件中通过import语句导入该模块。
假设我们有一个名为mymodule.py的自定义模块,内容如下:python复制代码# mymodule.pydef greet(name):return f"Hello, {name}!"def add(a, b):return a + b在其他Python文件中,我们可以这样导入并使用它:python复制代码# main.pyimport mymoduleprint(mymodule.greet("Alice")) # 输出Hello, Alice!print(mymodule.add(5, 3)) # 输出82.3 模块搜索路径Python解释器在导入模块时会搜索一系列预定义的目录,这些目录构成了模块的搜索路径(sys.path)。
C语言中的三种预处理功能

C语言中的三种预处理功能C语言中的三种预处理功能导语:预处理指令是以#号开头的代码行。
#号必须是该行除了任何空白字符外的第一个字符。
#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。
整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
下面是C语言三种预处理功能,欢迎阅读:指令用途# 空指令,无任何效果#include 包含一个源代码文件#define 定义宏#undef 取消已定义的宏#if 如果给定条件为真,则编译下面代码#ifdef 如果宏已经定义,则编译下面代码#ifndef 如果宏没有定义,则编译下面代码#elif 如果前#if条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写#endif 结束一个#if……#else条件编译块#error 停止编译并显示错误信息特殊符号预编译程序可以识别一些特殊的符号。
预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
注意,是双下划线,而不是单下划线。
FILE 包含当前程序文件名的字符串LINE 表示当前行号的整数DATE 包含当前日期的字符串STDC 如果编译器遵循ANSI C标准,它就是个非零值TIME 包含当前时间的字符串//例#includeint main(){printf("Hello World! ");printf("%s ",__FILE__);printf("%d ",__LINE__);return 0;}1. 宏定义不带参数宏定义又称为宏代换、宏替换,简称“宏”。
预处理(预编译)工作也叫做宏展开:将宏名替换为字符串,即在对相关命令或语句的含义和功能作具体分析之前就要换。
格式:#define 标识符字符串其中标识符就是所谓的符号常量,也称为“宏名”。
例:#define Pi 3.1415926//把程序中出现的Pi全部换成3.1415926 说明:(1)宏名一般用大写;(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。
本科专业认证《计算机与程序设计基础》(C语言)教学大纲

《计算机与程序设计基础》课程教学大纲英文名称:Fundamentals of Computer and Programming课程编号:0812010005学分:2.5总学时:40。
其中,讲授学时24,上机学时16。
适用专业:全校非计算机专业理工科本科生先修课程:无开课学院、系:计通学院计算机应用系一、课程目标《计算机与程序设计基础》课程是新生入校的第一门计算机课程,也是大学本科理工科专业学生必修的公共基础课程。
《计算机与程序设计基础》的主要教学目的是使学生较全面、系统地掌握计算机的基本知识,理解计算机操作系统基础知识、掌握操作系统的基本应用,了解办公自动化系统的概念、基本组成和关键技术,熟练掌握文字处理软件、电子表格软件、演示文稿制作软件的使用方法,掌握C语言的基本语法、编程技术和基本算法,掌握程序设计的基本思想和方法,具备利用计算机求解实际问题的基本能力,能灵活应用C语言进行程序设计,有一定的编程和调试程序的能力。
使学生具有利用计算机分析问题、解决问题的意识与能力,提高学生的计算机素养,为将来应用计算机知识和技能解决专业中的实际问题打下必要的基础。
按照国家提出的课程培养目标、以及开设了本课程的相关专业2017培养方案中的毕业要求,制定本课程学习目标如表1所示:表1 《计算机与程序设计基础》(C语言)课程目标-毕业要求关系表二、课程内容及学时分配本课程内容、建议学时以及知识单元与课程目标支撑关系如表2所示。
表2 《计算机与程序设计基础》(C语言)课程内容及学时分配三、教学方法根据所面向学生的不同特点和专业要求,针对不同的教学内容采用不同的组织方式。
对理论性较强的内容以课堂教学为主;对应用性强的部分精讲多练,加强课内实验和课外自主练习;对较复杂的操作性内容采用任务驱动的案例教学;对知识性方面的内容以学生自学为主,同时让学生充分利用网络资源、教育平台进行启发式、讨论式、研究式的自主学习,在教学中给学生提供多样化的探索空间,鼓励他们进行个性化发展。
C语言模块化编程

当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干。
你需要和你的小组成员分工合作,一起完成项目,这就要求小组成员各自负责一部分工程。
比如你可能只是负责通讯或者显示这一块。
这个时候,你就应该将自己的这一块程序写成一个模块,单独调试,留出接口供其它模块调用。
最后,小组成员都将自己负责的模块写完并调试无误后,由项目组长进行组合调试。
像这些场合就要求程序必须模块化。
模块化的好处是很多的,不仅仅是便于分工,它还有助于程序的调试,有利于程序结构的划分,还能增加程序的可读性和可移植性。
初学者往往搞不懂如何模块化编程,其实它是简单易学,而且又是组织良好程序结构行之有效的方法之一.本文将先大概讲一下模块化的方法和注意事项,最后将以初学者使用最广的keil c 编译器为例,给出模块化编程的详细步骤。
模块化程序设计应该理解以下概述:(1)模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明;这一条概括了模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c 文件,然后把该模块的接口函数放在.h文件中.举例:假如你用到液晶显示,那么你可能会写一个液晶驱动模块,以实现字符、汉字和图像的现实,命名为: led_device. c,该模块的.c文件大体可以写成:/************************************************* ************************* 液晶驱动模块** 文件: lcd_device.c* 编写人: 小瓶盖* 描述:液晶串行显示驱动模块,提供字符、汉字、和图像的实现接口* 编写时间: 2009.07.03* 版本:1.2************************************************** ***********************/#include ……//定义变量unsigned char flag;//局部变量static unsigned char value;//全局变量…//定义函数//这是本模块第一个函数,起到延时作用,只供本模块的函数调用,所以用到static 关键字修饰/********************延时子程序********************** **/static void delay (uint us) //delay time{}//这是本模块的第二个函数,要在其他模块中调用/*********************写字符程序********************* ******* 功能:向LCD写入字符** 参数:dat_comm 为1写入的是数据,为0写入的是指令content 为写入的数字或指令************************************************** ****/void wr_lcd (uchar dat_comm,uchar content){}…………/***************************** END Files************ ***********************/注:此处只写出这两个函数,第一个延时函数的作用范围是模块内,第二个,它是其它模块需要的。
C语言模块化编程掌握如何将程序分成多个模块进行编写和组织

C语言模块化编程掌握如何将程序分成多个模块进行编写和组织C语言是一种广泛应用于系统软件和应用软件开发的高级编程语言。
它的编程风格和技巧对于初学者来说可能有些困难,但掌握了模块化编程的技巧,可以使代码更加清晰、易读和易于维护。
本文将介绍C语言模块化编程的概念,以及将程序分成多个模块进行编写和组织的方法。
一、模块化编程的概念在C语言中,模块化编程是将一个大型程序分成若干个小模块进行开发和组合的技术。
每个模块负责处理特定的任务或功能,通过定义函数和变量来实现。
模块化编程可以提高代码的可复用性、可维护性和可扩展性,同时也有助于降低开发过程的复杂性。
二、将程序分成多个模块进行编写在进行模块化编程时,需要将程序按照不同的功能分成多个模块,每个模块独立完成特定的任务。
以下是一些分模块的方法和技巧:1. 定义接口:在每个模块中,定义清晰明确的接口,包括函数签名、参数和返回值类型等。
接口定义应该尽量简洁,并且提供足够的功能。
2. 模块间的通信:模块间的通信可以通过函数调用、全局变量或者传递指针等方式进行。
需要注意的是,模块间的耦合度应尽量降低,避免产生过多的依赖。
3. 模块独立性:每个模块应该尽可能独立、可独立编译和测试。
这样可以减少对其他模块的依赖,并提高开发效率。
4. 封装性:模块应该封装内部实现细节,只暴露给其他模块必要的接口。
这样可以隔离模块之间的影响,并隐藏实现细节。
5. 命名规范:为了提高代码的可读性和可维护性,可以采用一定的命名规范,如使用有意义的函数和变量名,避免重复命名等。
三、模块的组织和管理在进行模块化编程时,模块的组织和管理是非常重要的。
以下是一些建议和技巧:1. 模块划分:根据程序的功能和逻辑,将程序分成多个模块,并确定各个模块之间的依赖关系。
2. 模块命名:为每个模块选择一个有意义的名字,可以根据功能、任务或者特定的业务需求来命名。
3. 模块文档:为每个模块编写相关的文档,包括接口说明、函数用途、参数说明和返回值说明等。
程序预处理的详细解释

程序预处理的详细解释程序预处理是指在编译过程中对源代码进行预处理操作的过程。
预处理器是编译器的一部分,它负责根据预处理指令来处理源代码,将源代码中的预处理指令替换成相应的内容,以及执行一些宏定义、文件包含和条件编译等操作。
预处理器的主要作用包括:1. 宏定义:通过使用#define指令,可以在源代码中定义一些宏,将一些常用的代码片段或常量定义为宏,以便在程序中多次使用。
预处理器会将宏定义的地方替换为相应的宏内容。
2. 文件包含:通过使用#include指令,可以将其他源代码文件包含到当前的源文件中,以便在当前文件中使用包含文件中的定义和函数。
预处理器会将包含指令替换为被包含文件的内容。
3. 条件编译:通过使用#if、#ifdef、#ifndef、#elif、#else和#endif等指令,可以根据条件选择性地编译源代码的不同部分。
预处理器会根据条件表达式的结果来决定是否编译相应的代码。
4. 预定义宏:预处理器会定义一些特殊的预定义宏,如__FILE__表示当前源文件的文件名,__LINE__表示当前行号,__DATE__表示当前的日期等。
可以在程序中使用这些预定义宏,以便在编译时获取一些相关的信息。
5. 条件编译错误:预处理器可以检测到一些条件编译错误,如未关闭的#if、#ifdef等指令,或者条件表达式中出现的未定义的宏等,从而帮助开发者及早发现和解决问题。
预处理操作是在编译过程的第一个阶段进行的,它将源代码中的预处理指令替换为相应的内容后,生成一个经过预处理的中间代码。
这个中间代码会被传递给编译器的下一个阶段进行编译和链接,最终生成可执行文件。
程序预处理是在编译过程中对源代码进行一系列文本替换和操作的过程,它可以通过宏定义、文件包含和条件编译等功能来简化和优化源代码,提高程序的可维护性和可移植性。
C语言编译过程总结详解
C语言编译过程总结详解C语言的编译过程可以分为四个主要阶段:预处理、编译、汇编和链接。
下面会详细解释每个阶段的工作原理。
1.预处理阶段:预处理器的主要作用是根据源文件中的预处理指令对源代码进行一系列的文本替换和宏展开,生成经过预处理的源代码文件。
预处理指令以"#"开头,主要包括#include、#define、#ifdef等。
预处理器的工作原理如下:- 处理#include指令:将包含的头文件内容插入到当前位置,形成一个单独的源代码文件。
- 处理#define指令:将宏定义替换为对应的内容。
- 处理#ifdef指令:根据条件判断指令是否执行。
预处理阶段生成的文件以".i"为后缀,可以用编译器提供的预处理器命令进行预处理,如gcc -E source.c -o source.i。
2.编译阶段:编译器将预处理阶段生成的经过预处理的源文件进行词法分析、语法分析、语义分析和优化,生成汇编代码。
编译阶段包括以下几个步骤:-词法分析:将源代码分解成一个个的词法单元,如标识符、关键字、常量等。
-语法分析:分析和验证词法单元之间的语法关系,生成语法树。
-语义分析:对语法树进行语义检查,如类型检查、变量声明检查等。
-优化:进行编译优化,如常量折叠、无用代码删除等。
编译阶段生成的文件以".s"为后缀,可以用编译器提供的编译器命令将汇编代码转化为可执行文件,如gcc -S source.i -o source.s。
3.汇编阶段:汇编器将编译阶段生成的汇编代码转化为机器码。
汇编阶段包括以下几个步骤:-符号解析:将符号(如函数名、变量名)与其对应的地址进行关联。
-指令生成:将汇编代码转化为机器码。
汇编阶段生成的文件以".o"为后缀,可以用编译器提供的汇编器命令将目标文件转化为可执行文件,如gcc -c source.s -o source.o。
预编译处理
预编译处理【学习目标】◇理解编译预处理的概念。
◇了解宏定义的概念,掌握简单宏定义和带参数的宏定义的格式和使用方法。
◇了解文件包含的概念,掌握文件包含的格式和使用方法。
能在程序中合理使用#include预处理指令◇了解条件编译的概念,掌握条件编译的三种格式及其使用方法。
能在程序中合理使用#define, #if, #ifndef, #else, #undef, #elif等指令。
【重点和难点】重点:编译预处理的概念,简单的宏定义与文件包含指令的用法。
难点:带参宏定义,条件编译指令,会用条件指令解决文件的重复包含问题。
【学习方法指导】本章的内容比较简单,严格说来,它也不算是C++语言的组成部分。
但是,一般说来,任何程序都离不开预编译指令。
特别是文件包含指令和条件编译指令,应把它们搞清楚。
虽然可以用宏定义的方法定义常数,但推荐使用const语句定义常量。
在编程中,如果我们能恰当地运用条件编译,就可以提高程序运行的效率。
【知识点】宏定义;宏替换;简单的宏定义;带参数的宏定义;文件包含;条件编译第一节宏定义我们用C++进行编程的时候,可以在源程序中包括一些编译命令,以告诉编译器对源程序如何进行编译。
这些命令包括:宏定义、文件包含和条件编译,由于这些命令是在程序编译的时候被执行的,也就是说,在源程序编译以前,先处理这些编译命令,所以,我们也把它们称之为编译预处理,本章将对这方面的内容加以介绍。
实际上,编译预处理命令不能算是C++语言的一部分,但它扩展了C++程序设计的能力,合理地使用编译预处理功能,可以使得编写的程序便于阅读、修改、移植和调试。
预处理命令共同的语法规则如下:◇所有的预处理命令在程序中都是以"#"来引导如"#include "stdio.h""。
◇每一条预处理命令必须单独占用一行,如"#include "stdio.h" #include <stdlib.h>" 是不允许的。
如何在编程中使用模块
如何在编程中使用模块编程是一门创造性的艺术,通过编写代码来实现各种功能。
在编程的世界里,模块是一个非常重要的概念。
模块可以理解为一个独立的、可重用的代码单元,它可以包含变量、函数、类等。
在本文中,我将探讨如何在编程中使用模块,以提高代码的可维护性和可扩展性。
一、模块的定义和作用模块是将相关的代码组织在一起的一种方式。
它可以将代码分割成逻辑上独立的部分,使得代码更易于理解和维护。
通过使用模块,我们可以将代码按照功能进行组织,提高代码的可读性和复用性。
模块的作用不仅仅是将代码组织起来,它还可以提供一种封装的机制。
通过封装,我们可以隐藏模块内部的实现细节,只对外部暴露必要的接口。
这样可以降低代码的耦合度,提高代码的可维护性和可扩展性。
二、模块的导入和使用在大部分编程语言中,使用模块需要先导入它。
导入模块可以使用关键字(如import)或特定的语法来实现。
导入模块后,我们可以使用模块中定义的变量、函数、类等。
例如,在Python中,我们可以使用以下语法导入一个名为"math"的模块:```pythonimport math```导入模块后,我们可以使用模块中的函数和变量。
例如,使用math模块中的sqrt函数计算一个数的平方根:```pythonresult = math.sqrt(16)```通过模块的导入和使用,我们可以利用已有的模块来实现各种功能,而不需要重复编写代码。
这样可以提高开发效率,并减少出错的可能性。
三、模块的分类模块可以分为两种类型:内置模块和第三方模块。
内置模块是编程语言本身提供的模块,它们通常包含一些常用的功能和工具。
例如,在Python中,有一个名为"random"的内置模块,它提供了生成随机数的函数。
通过使用内置模块,我们可以方便地实现各种随机数生成的需求。
第三方模块是由其他开发者编写并发布的模块。
这些模块通常提供一些特定的功能或解决特定的问题。
C语言程序设计教程 第6章
模块设计的原则
模块独立
规模适当
层次分明
2017/8/21
功能专一
12
独立性原则表现在模块完成独立的功能 , 和其它模块间的关系简单 , 各模块可以单独调 试。修改某一模块 , 不会造成整个程序的混乱。
每个模块有特定功能
每个模块完成一个相对独立的特定子功能。在对任务逐步 分解时,要注意对问题的综合。例如, 一些模块的相似的 子任务,可以把它们综合起来考虑,找出它们的共性,把它 们做成一个完成特定任务的单独模块。
返回值
另外请注意这样的判断,如写成‘ 最好只使用局部变量,这样将方便调试。 如果不需返回则可 调用函数时输入参数的格式要与之相同 return 0; A‟<capital<„Z‟是不行 注意不要与已有库函数重名 的 2017/8/21
24
“函数”的主要知识点
函数的定义 函数的参数和返回值 函数的调用 嵌套和递归 变量的作用域
2017/8/21
18
例6.2 设计算法:找出a,b两数中的较大者,并输出
分析: 这个问题分三个步骤: • 输入两个数; • 找出其中的大数; • 输出大数。
2017/8/21
19
开始
输入a,b
0 a<b 非0 交换a,b 输出a
结束
2017/8/21
图6.3 找出a,b两数中的较大者算法流程图
2017/8/21
34
函数返回值
函数返回值通过return语句获得 函数返回值的类型就是函数的类型 return y; 将变量y的值返回给调用者 return y+3; 将表达式的值返回给调用者
2017/8/21 35
return 的数据类型与函数的类型矛盾时,自动 将数据转换成函数的类型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
赵岩
C语言
20 / 27
预处理指令 模块化编程
基础知识 工程实例
文件中的变量
文件的信息隐藏
用static定义的函数和变量只在此模块(文件)中有效 (建议采用)
允许被其它文件使用的全局变量
在源文件中定义,不加static修饰 在头文件中进行声明,加extern修饰
基本知识之声明和定义
声明就是让编译器能够认识它, 而定义就是让链接器能够找到它。 1 i n t i ; /∗ d e f i n e ∗/ 2 e x t e r n i n t i /∗ d e c l a r e ∗/ 1 f o o ( ) ; /∗ d e c l a r e ∗/ 2 3 f o o ( ) { /∗ d e f i n e ∗/ 4 .... 5 }; 问题 foo(){}; 是声明还是一个定义?
赵岩 C语言 24 / 27
预处理指令 模块化编程
基础知识 工程实例
多文件工程实例源码-Area.h
1 2 3 4 5 6 7 8 9
#i f n d e f #d e f i n e
AREA H AREA H
e x t e r n c o n s t double PI ; extern int global times ; do ub le C i r c l e A r e a ( double r ) ; v o i d GetTimes ( ) ; #e n d i f
预处理指令 模块化编程
基础知识 工程实例
工程-project
工程通常包含:
源文件(xxx.c):一系列相关函数和全局变量的定 义 头文件(xxx.h):函数和全局变量的声 明 ,如:函数声 明、外部变量声明、宏定义、类型定义...
可以将模块编译为.o、.a、.obj或.lib文件,同.h文件一 起供别人使用,从而保护了源代码 使用模块的过程
定义宏的时候注意替换发生后产生的非预想结果
用括号可以避免一些非预想结果
赵岩
C语言
4 / 27
预处理指令 模块化编程
#define的缺点
它只是简单的替换,不进行任何语法检查 Demo 1: A example of define #d e f i n e PI 3 . 1 4 1 5 ; #d e f i n e max(A, B) ( (A) > (B) ? (A) : (B) ) v o i d main ( ) { int i = 4; p r i n t f ( "%f\n" , PI ) ; / ∗ c o m p i l e e r r o r ∗ / max( i ++ ,3); / ∗ ( ( i ++)>3?( i ++):3); ∗ / p r i n t f ( "%d\n" , i ) ;
赵岩 C语言 18 / 27
预处理指令 模块化编程
基础知识 工程实例
不仅正确,而且优雅!
b.h文件 1 #i f n d e f B H 2 #d e f i n e B H 3 foo ( ) ; 4 extern int i ; 5 #e n d i f /∗ b . h ∗/
赵岩
C语言
19 / 27
C语言
第6讲:预处理指令和模块化编程 赵岩
哈尔滨工业大学软件学院
March 6, 2011
预处理指令 模块化编程
目录
1
预处理指令
赵岩
C语言
2 / 27
预处理指令 模块化编程
目录
1
预处理指令
2
模块化编程 基础知识 工程实例
赵岩
C语言
2 / 27
预处理指令 模块化编程
预编译指令
编译器在开始正式编译之前处理的指令,叫预编译指 令
赵岩
C语言
9 / 27
预处理指令 模块化编程
避免重复包含
赵岩
C语言
10 / 27
预处理指令 模块化编程
使用预编译指令的目的
增强程序可读性
但是调试时宏可能ቤተ መጻሕፍቲ ባይዱ带来很多问题
精简源代码,提取变化
这一点更多时候用函数的效果更好,但宏也有其不可 替代的优势
不编译无用代码,精炼目标代码
赵岩
C语言
11 / 27
赵岩 C语言
1 2 3 4 5 6 7 8 9 10 11 }
5 / 27
预处理指令 模块化编程
#define的替换方法
const 常量 模板内联函数 Demo 2: Better method 1 c o n s t do ub le PI 3 . 1 4 1 5 ; 2 3 template < c l a s s T> 4 i n l i n e c o n s t T& max( c o n s t T& a , c o n s t T& b ) 5 { return a > b ? a : b ; }
赵岩
C语言
8 / 27
预处理指令 模块化编程
跨平台
1 #i f d e f l i n u x 2 #i n c l u d e 3 #i n c l u d e 4 #e l s e 5 #i n c l u d e 6 #i n c l u d e 7 #e n d i f
< e x t / hash map> <e x t / h a s h s e t > <hash map> <h a s h s e t >
赵岩 C语言
23 / 27
预处理指令 模块化编程
基础知识 工程实例
多文件工程实例源码-Area.c
1 2 3 4 5 6 7 8 9 10 11 12 13 #i n c l u d e "Area.h" c o n s t do ub le PI = 3 . 1 4 1 5 9 2 6 ; / ∗ 全局常量 ∗ / i n t g l o b a l t i m e s = 0 ; / ∗ 全局变量 ∗ / s t a t i c i n t t i m e s = 0 ; / ∗ 静态变量 ∗ / do ub le C i r c l e A r e a ( double r ) { t i m e s++; r e t u r n PI ∗ r ∗ r ; } v o i d GetTimes ( ) { g l o b a l t i m e s = times ; }
赵岩
C语言
6 / 27
预处理指令 模块化编程
#include指令
用#include指定文件的内容替换#include所在的行 也是简单的替换,养成在头文件后面加上分号的习 惯。 用<>或者“ ”括上文件名
<>表示在编译器的include目录内查找文件 “ ”表示在当前目录下查找文件
文件名中可以带有路径
赵岩
C语言
14 / 27
预处理指令 模块化编程
基础知识 工程实例
例子2
a.c文件 1 i n t i =5; / ∗ a . c ∗ / 2 main ( ) { 3 p r i n t f ( "%d" , f o o ( ) ) ; 4 } b.c文件 1 i n t i ; /∗ b . c ∗/ 2 foo (){ 3 i ∗ =2; 4 };
预处理指令 模块化编程
基础知识 工程实例
基本知识之编译器和链接器
C语言是每个C文件单独编译的
每次只编译一个C文件,看不到其它的C文件
编译器
编译器确认每个标识符的类型 我要认识它
链接器
链接过程在内存中定位这个标识符 我要唯一地 找到它
赵岩
C语言
12 / 27
预处理指令 模块化编程
基础知识 工程实例
赵岩 C语言 17 / 27
预处理指令 模块化编程
基础知识 工程实例
不仅正确,而且优雅!
a.c文件 1 2 3 4 5 #i n c l u d e "b.h" / ∗ a . c ∗ / i n t i =5; main ( ) { p r i n t f ( "%d" , f o o ( ) ) ; } b.c文件 1 #i n c l u d e "b.h" / ∗ b . c ∗ / 2 foo (){ 3 i ∗ =2; 4 };
编译器编译的是经过预编译处理后的代码 预编译过程不进行C语法检查
赵岩
C语言
3 / 27
预处理指令 模块化编程
#define
#define 宏名字 替换文本 在#define之后,所有独立出现“宏名字”的地方(除了 字符串内)都被“替换文本”替换 “替换文本”中可以有空格 宏可以有参数
#define max(A,B) ((A) > (B) ? (A) : (B))
赵岩
C语言
25 / 27
预处理指令 模块化编程
基础知识 工程实例
总结
赵岩
C语言
26 / 27
预处理指令 模块化编程
基础知识 工程实例
谢谢大家,欢迎提问!
赵岩
C语言
27 / 27
赵岩
C语言
21 / 27
预处理指令 模块化编程
基础知识 工程实例
多文件工程实例
整个项目包含两个源文件(编译单元)
计算圆面积 主函数
赵岩
C语言
22 / 27