




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第6章 C+语言程序结构,6.1 基本概念 6.2 编译预处理命令 6.3 C+程序文件的组织 6.4 命名空间 不同的程序结构而产生共享程度不同,2,6.1 基本概念,6.1.1 标识符的作用域与可见性 1作用域 标识符的作用域指的是它在程序文件中的有效范围。 (1)局部作用域 函数原型作用域 void exp(int a, float b); /a和b的作用域仅限在圆括号内,3,块作用域: 在某一个函数的完整定义中或是复合语句中说明的标识符,其作用域是块作用域,它的有效范围是从该标识符被说明处开始,到函数定义完成或复合语句的结束。 void fun(char c) cinc; if(c=a ,4,用户自定义类型时为各成员命名所说明的标识符也具有局部作用域,如结构体和类的成员其标识符仅在该成员可被合法使用的地方有效。 struct stu int id; char name8; ; void main( ) struct stu A; A.id=1; strcpy(A.name,”zhang”); id=10; ,5,(2)全局作用域 没有被任何定界符限定起来的标识符,具有全局作用域,有效范围起始于该标识符被说明的地方,终止于整个文件结束。 int x,y; void main( ) cinxy; coutx+yendl; ,6,2.可见性:标识符在作用域内可以使用 “靠近”原则: 多层包含取内层 int a=1; void f( ) int a=0; a+;/a=? ,不同块互不影响 void f1(int a) int b; void f2(int a) int b; /两个a,b不影响,7,6.1.2 存储类型与生存期 1存储类型 存储类型是指变量创建后以何种方式存在于物理内存中。在C+语法规则中变量的存储类型有4种,auto、register、static和extern,说明变量的存储类型的方法是: 存储类型 类型 变量名表;,8,6.1.2 存储类型与生存期 1存储类型 (1)auto(自动的)具有局部作用域的变量默认的存储类型,自动变量被存储在用户区的动态存储区中。 (2)register(寄存器的)局部作用域的变量加register修饰后,变量被存储在处理器特定的寄存器组中,该区域的存取速度高于一般内存。 (3)static(静态的)变量被存储于用户区的静态存储区中,如果是具有全局作用域的变量被static修饰,则该变量不可以在本文件以外的地方被引用。 (4)extern(外部的)具有全局作用域的变量默认的存储类型,变量被存储于用户区的静态存储区中,该变量可以被本文件以外的其他文件使用。,9,2生存期 变量的生存期是指变量被创建成功直至消亡之间的阶段。生存期最本质的意义在于,变量在其生存期内将占有并保持它的内存空间。 生存期分为静态生存期和动态生存期两种: 自动变量和寄存器变量在程序运行之后随时被创建,其作用域结束后被撤消,所以这种变量的生存期要小于程序的运行期,称为动态生存期; 静态变量和外部变量在程序编译时即获得存储空间,并一直保持到程序运行结束,与程序的运行期相等,称为静态生存期。,10,int a=100; void fun( ) int b=10; cout+aendl; cout+bendl; void main() fun( ); fun( ); ,11,6.1.3 全局变量和局部变量 1. 全局变量 全局变量它在程序的整个执行过程中都存在。 全局变量可以被两种关键字修饰,extern与static。,12,在全局作用域中定义的变量,如果没有指定显式的初始值,则该存储区被初始化为0。 int var1 = 0 ; int var2 ; static int var3; 关键字extern 为声明但不定义一个变量提供了一种方法。extern 声明不会引起内存被分配,它可以在同一文件中或同一程序的不同文件中出现多次。 既指定了关键字extern,又指定了一个显式初始值的全局变量声明将被视为该变量的定义。 如 extern double pi = 3.1416 ; 关键字static则将全局变量的使用限定在了当前文件中。,13,#include using namespace std; extern int a; int b; extern int c=3; static int d; void main( ) int a=1; coutaendl; coutbendl; coutcendl; coutdendl; ,14,2. 局部变量 具有局部作用域的变量称为局部变量,按其所在存储区的属性和生命期,可将局部变量分为3种:自动变量、寄存器变量以及局部静态变量。 自动变量所在存储区从声明它的函数被调用时开始一直到该函数结束为止,寄存器变量是一种自动变量,因其存放在特殊的寄存器中支持对其值的快速存取,局部静态变量的存储区在该程序的整个执行期间一直存在。,15,(1)自动变量 自动变量的存储分配发生在定义它的函数被调用时,未初始化的自动变量包含一个随机的位模式,是该存储区上次被使用的结果。在函数结束时,它的活动记录被从运行栈中弹出。与该自动变量相关联的存储区被真正释放,变量的生命期在函数结束时结束,它包含的任何值都被抛弃。 自动变量的地址不应该被用作函数的返回值,因为函数一旦结束了,该地址就指向一个无效的存储区。,16,int* fun(int a,int n) int p=a0,i=1; while(in) if(pai) p=ai; i+; return ,17,float x=365.5; void main( ) int x=1,y=2; double w=x+y; double x=1.414,y=1.732,z=3.14; coutxendl; coutyendl; coutzendl; coutwendl; coutxendl; coutyendl; coutwendl; /coutzendl; /错误 cout:xendl; ,18,2. 局部变量 (2)register变量 在函数中被频繁使用的自动变量可以用register 声明。例如循环语句中的数组索引和指针,选择寄存器变量可以提高函数的执行速度。关键字register 对编译器来说只是一个建议。如果可能的话编译器会把该变量装载到机器的寄存器中,如果不能够的话,则变量仍位于内存中,作为普通的自动变量。 (3)静态局部变量 静态局部变量的值在函数调用之间保持有效,但是其名字的可见性仍限制在其局部域内。静态局部变量在程序执行到该变量的声明处时被首次初始化,且仅初始化一次。未经初始化的静态局部变量会被程序自动初始化为0。,19,void fun( ) static int a=1; a+; coutaendl; void fun1( ) int b=1; b+; coutbendl; int main(int argc, char* argv) fun(); fun(); fun1(); fun1(); return 0; ,程序运行结果: 1 2 1 1,20,6.2 编译预处理命令,6.2.1 文件包含命令 文件包含预处理命令的其格式为: #include 或 #include“文件名“ 其含义是:在编译前,用命令中的文件名所指定的文件内容替换该命令,尖括号表示在系统指定的目录下寻找该文件,引号“表示先在包含#include命令的文件的目录下寻找,若找不到再到系统指定的目录下寻找。如: #include #include “myhead.h“,21,6.2.2 宏定义 1. #define 宏名 文字串 在编译前,把程序文本中出现宏名的地方用文字串替换,主要用于符号常量的定义。如: #define PI 3.14 void main( ) cout“以5为半径的圆的“endl; cout“周长为“2*PI*5endl; cout“面积为“PI*5*5endl; ,22,2. #define 宏名(参数表) 文字串 在编译前,把程序中出现宏名的地方用文字串替换,并且,文字串中的参数(相当于形参)将替换成使用该宏名的地方所提供的参数(相当于实参)。 #define area(a) 3.14*(a)*(a) void main() coutarea(10)endl; /结果为314 coutarea(5+5)endl; /结果为314 ,23,在进行带参数宏的定义时要注意,为确保参数在宏替换的过程中不产生解释上的错误,要将文字串中的参数用圆括号括起来。 #define area(a) 3.14*a*a void main( ) coutarea(10)endl; coutarea(5+5)endl; 在原例中area(5+5)被替换成3.14*(5+5)*(5+5),即3.14*10*10,而丢掉参数的圆括号后则被替换成3.14*5+5*5+5,结果显然不对。,24,3. #define 宏名 告诉编译程序该宏名已被定义,并不做任何的文本替换,其作用是实现条件编译。如: #define PI 4. #undef 宏名 取消某个宏名的定义,其后的宏名不再进行替换和不再有宏定义。如: #undef PI,25,6.2.3 条件编译 1. 单分支条件编译 格式: #if 条件 代码段 #endif “条件”为真时,执行代码段,否则跳过此预处理部分。,26,2. 双分支条件编译 格式: #if 条件 代码段1 #else 代码段2 #endif “条件”为真,执行代码段1编译,否则执行代码段2编译,27,3. 多分支条件编译 格式: #if 条件1 代码段1 #elif 条件2 代码段2 #elif 条件n 代码段n #else 代码段n+1 #endif “条件1”为真时,执行代码段1,否则“条件2”为真时执行代码段2,直到所列的n个条件均不满足时执行代码段n+1。,28,此外,条件编译与宏定义的复合是比较常见的形式,在多文件编译中是非常有效的。如: #ifdef 宏名 代码段 #endif 或 #ifndef 宏名 代码段 #endif,29,#ifdef PI void area(int r) coutPI*r*rendl; #else void area(int r) cout3.14*r*rendl; #endif void main( ) area(10); ,30,6.3 C+程序文件的组织,6.3.1 多文件联合编译的实例 /test.cpp extern int a; void func1( ) a+; ,/main.cpp #include int a; void func1( ); void main( ) cina; func1( ); coutaendl; ,31,6.3.2 外部变量与外部函数 1. 外部变量 在编写C+程序时,有些变量可能会被多个文件使用,为简化设计,更重要的是统一变量的标识符,可以将这种变量用extern声明为外部变量。 2. 外部函数 与非static全局变量可在其他文件中使用一样,函数也可以被其他文件中使用。 加extern或缺省时函数都可以在当前文件和与当前文件相关联的其他文件中使用;而加static修饰后表示该函数只能够在当前文件中使用。,32,6.3.3 头文件 头文件为所有extern变量声明、函数声明以及inline函数定义提供了一个集中的位置,这被称作声明的局部化(localization)。头文件的扩展名为.h。 头文件提供了两个安全保证: 第一保证所有文件都包含同一个全局变量或函数的同一份声明 第二如果需要修改声明则只需改变一个头文件。,33,/def.h int a; extern int b; void fun( );,/main.cpp #include “def.h“ int a=10; int b=10; void fun( ) void main( ) fun( ); ,34,/A.h struct A int a; ; /B.h #include “A.h“ struct B struct A a1; ;,/修改后的A.h #ifndef _A_H #define _A_H struct A int a; ; #endif,/main.cpp #include “B.h“ #include “A.h“ void main( ) B b1, A a1; ,35,6.3.4 C+程序的一般组织结构,36,6.4 命名空间,6.4.1 什么是命名空间 所谓命名空间,是一种将程序库名称封装起来的方法,它就像在各个程序库中立起一道道围墙。 / one
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 偏导数课件教学课件
- 你一定会听见课件
- 2026届河北省市巨鹿县二中物理高三上期末质量跟踪监视模拟试题
- 陆军飞行员管理办法
- 3.1世界是普遍联系的 课件 统编版高中政治必修4
- 上海境外输入管理办法
- 企业特种设备安全培训课件
- 企业消防安全培训讲话课件
- 税务廉政约谈管理办法
- 烟草生产收购管理办法
- 小提琴培训行业市场前瞻与未来投资战略分析报告
- 高职大学生心理健康教育 第四版 课件 第四单元 和谐人际关系
- 安全教育培训课件:机械设备维护和保养指南
- InDesign印前设计与实战 课件 第二章 印前设计版面概述-印刷基础知识
- 员工培训体系优化研究
- 医疗器械供货合同正式版
- 人教版七年级英语下册阅读专项训练60篇-含答案
- 范里安-微观经济学:现代观点
- 2023版X99主板BIOS详细设置手册
- 小学语文课外补充古诗词
- 高中心理健康教育北师大版高二全册第6课《温故知新》省级名师优质课教案比赛获奖教案示范课教案公开课教案
评论
0/150
提交评论