- 1、本文档共108页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在多个文件中声明外部变量 参见例7.21,见源码7-21 用static声明外部变量 有时在程序设计中希望某些外部变量只限于被本文件中使用,而不能被其他文件引用。这时可以在定义外部变量时加一个static声明。这类变量也叫模块变量,它只能在本模块(文件)中使用。 把例7.21中的变量A声明为静态的,试一试,编译是否能通过? static声明变量的作用 用static来声明一个变量的作用有二: 1)对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在。 2) 全局变量用static声明,则该变量的作用域只限于本模块(文件)。 变量使用说明 1)变量声明用extern,如果不加extern,则认为是变量定义。变量声明是说明该变量在系统中的某个地方已被定义,声明后,可以使用该变量,因此,声明变量不占内存空间。 2)任何变量声明,若被多个源文件使用,建议把该声明放在一个头文件中,这样,要使用的源文件直接包含该头文件即可。这样作是便于程序的维护,因为若要修改该变量,只需一个头文件即可。 3)不要在头文件中定义变量。头文件是存放声明的地方,而不是存放定义的地方;定义应用放在源文件中,这样不容易出错。 4)如果一个外部变量只在变量定义的源文件中使用,即该变量是模块变量,则定义该变量时,加上static。这样做便于程序的维护,如果别的模块要强行应用该变量,编译都通不过。 全局函数和模块函数 函数分类:函数根据能否被其他源文件调用,分为: 模块函数(内部函数) 只能在本文件中被使用。 全局函数(外部函数) 既能在本文件中被使用,又能其它文件中被使用。 模块函数 定义和声明时,都需加上static关键字。 如: static int fun(int a,int b); // 声明 static int fun(int a, int b) // 定义 { …… } 加上“static”后,如果其它源文件要使用该函数,编译就会报错。 全局函数 定义和声明函数时,不能加static关键字; 如: int fun(int a, int b); // 声明 int fun(int a, int b) // 定义 { …… } 如果其它源文件要使用该函数,要有两种方式: 1)把函数声明放在一个头文件中,然后在需要该函数的源文件中引用该头文件。 2)在需要使用该函数的源文件中声明该函数: extern int fun(int a, int b); 这里的“extern”,可以不要,因为函数什么可以不加“extern”。 示例 例7.22 程序代码见源码7-22。 总结 模块函数在定义和声明时,须加上static 模块变量(在函数外部定义的,又只在本文件中使用的变量)在定义时,须加上staitc 总结static的作用(有三个)? (二)预处理 简介 ANSI C标准规定可以在C源程序中加入一些“预处理命令”(preprocessor DireCtiveS) ,以改进程序设计环境,提高编程效率。这些预处理命令是由ANSI C统一规定的,但是它不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。必须在对程序进行通常的编译(包括词法和语法分析、代码生成、优化等)之前,先对程序中这些特殊的命令进行“预处理”。 C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。 内容 宏定义 “文件包含”处理 条件编译 (2.1)宏定义 不带参数的宏定义 用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: #define 标识符 字符串 如我们在前面介绍的定义符号常量的方式: #define PI 3.1415926 作用是指定用标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。 这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”。 “#define”是宏定义命令。 函数的递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 C语言的特点之一就在于允许函数的递归调用。 函数递归调用示例(例8.7) 例6.7 有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大。 分析:显然,这是一个递归问题: age(5)=age(4)+2 age(4)=age(3)+2
文档评论(0)