版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020年8月25日星期二,第9章 程序组织和编译预处理,C+实用教程,2,目录,9.1 作用域和可见性 9.2 内存区和存储类型 9.3 编译预处理 9.4 名称空间,C+实用教程,3,9.1 作用域和可见性,作用域又称作用范围,是指程序中标识符(变量名、函数名、数组名、类名、对象名等)的有效范围。 标识符的作用域分为5种:函数原型作用域、函数作用域、块作用域、类作用域和文件作用域。 一个标识符是否可以被引用,称为标识符的可见性。 在一个C+程序中,一个标识符只能在声明或定义它的范围内可见,在此之外是不可见的。,C+实用教程,4,9.1.1 函数原型作用域,函数原型作用域指声明函数原型时所指
2、定的参数标识符的作用范围。 该作用范围在函数原型声明中的左、右圆括号之间。 可以与函数定义中说明的标识符名称不同 可以省略,int x ; int sum( int x , int y ) ; y = 100 ; int main() . int sum( int a, int b ) ,/ error,C+实用教程,5,9.1.2 函数作用域,具有函数作用域的标识符在声明它的函数内可见,但在此函数之外是不可见的。 在C+中,只有goto语句使用的标号是唯一具有函数作用域的标识符。 标号可以先使用后声明。 goto语句不能跨函数跳转。,void fun(void) int a, sum=0;
3、START: cina; if (0=a) goto END; else sum+=a; goto START; END: coutsumendl; ,C+实用教程,6,9.1.3 块作用域,在块(语句)中声明的标识符,其作用域从声明处开始,直到结束块的花括号为止。 块作用域也称局部作用域,具有块作用域的变量是局部变量。 注意:当标识符的作用域完全相同时,不允许出现相同的标识符名。而当标识符具有不同的作用域时,允许标识符同名。,void fun(void) int a; cin a; if (a0) a=-a; int b; ,a作用域,b作用域,void fun(void) int a; i
4、nt a; a=100; couta; ,C+实用教程,7,9.1.4 文件作用域,所有在函数外定义的标识符称为全局标识符。 全局标识符的作用域是文件作用域,它从声明处开始,直到文件结束一直是可见的。 (1)全局常量或全局变量的作用域从定义开始到源程序文件结束。 (2)若函数定义在后,调用在前,必须进行函数原型声明。 (3)对于头文件中定义的标识符,当它们被预编译时,头文件的内容将在源文件的相应位置展开,所以在头文件中定义的标识符的作用域可以看成从#include该头文件开始的位置到源程序文件结束。,const float PI=3.14; int a; void main() / void
5、fun(void) / ,C+实用教程,8,作用域的层次,如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。 对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见(即名称的屏蔽,或可见性)。,C+实用教程,9,/ id=7,/ id=5,/ temp=4,#include int id = 3 ; /文件作用域 int temp = 4 ; int main( ) id = 5 ; if ( id 0 ) int id ; /块作用域 id = 7 ; coutid=idendl; cout“temp=“te
6、mpendl; coutid=idendl; ,C+实用教程,10,9.1.5 域运算符,作用域嵌套的时候,如果被隐藏的是全局变量,则可用域运算符“:”来引用该全局变量。,C+实用教程,11,例Ex_Process 在块作用域内引用文件作用域的同名变量示例,#include using namespace std; int i = 10;/ A int main() int i = 20;/ B int i = 5;/ C int j; :i = :i + 4;/ :i是引用A定义的变量i,不是B中的i j = :i + i;/ 这里不加:的i是C中定义的变量 cout:i = :i, j =
7、 jn; cout:i = :i, i = in; / 这里不加:的i是B中定义的变量 return 0; ,C+实用教程,12,9.1 作用域和可见性 9.2 内存区和存储类型 9.3 编译预处理 9.4 名称空间,C+实用教程,13,9.2 内存区和存储类型,存储类型是针对变量而言的,它规定了变量的生存期。 无论是全局变量还是局部变量,编译系统会根据其存储方式定义、分配和释放相应的内存空间。 变量的存储类型反映了变量在何处开辟内存空间,以及占用内存空间的有效期限。,C+实用教程,14,9.2.1 内存区,在C+中,一个程序编译后的数据所占用的内存可简单地分为4个区,分别是: 栈(stack
8、):连续,大小由操作系统预先规定,编译时自动分配和释放,存放程序中的局部变量、数组、函数参数等,容易产生溢出(overflow) 。 堆(heap):不连续,虚内存,大小不限,通过程序管理,用new和delete动态分配和释放,速度慢。 全局/静态数据区:堆结构,管理由系统自动进行,存放程序中的全局变量、静态(static)数据等。 常量区:存放常量(如数值常量、字符常量、字符串常量等),不可修改。,C+实用教程,15,9.2.2 自动类型和寄存器类型,在C+中,变量有4种存储类型:自动类型(auto)、静态类型(static)、寄存器类型(register)和外部类型(extern)。 存储
9、类型指定的一般格式: 存储类型缺省时为自动类型,在栈区中分配内存空间。 使用register声明时,可加快程序的运行速度。若系统寄存器已经被其他数据占据,会自动被当做auto变量。, ;,C+实用教程,16,9.2.3 静态类型,若在声明局部变量类型时加上关键字static,则将其定义成了一个静态类型的变量。 静态类型的局部变量虽具有局部变量的作用域,但却有全局变量的生存期。 在声明静态类型变量时,若没有指定初值,编译器会将其置为0。 静态类型的变量只在第一次执行时进行初始化。,C+实用教程,17,例Ex_Static 使用静态类型的局部变量,#include using namespace
10、std; void count() int i = 0; static int j = 0; / 静态类型 i+; j+; couti = i, j = jn; int main() count(); count(); return 0; ,C+实用教程,18,静态全局变量,在程序中声明的全局变量总是静态存储类型。 若在全局变量前加上static,使该变量只在这个源程序文件内使用,称为全局静态变量或静态全局变量。 若一个程序由一个文件组成,在声明全局变量时,有无static并没有区别,但若多个文件组成一个程序时,加与不加static,其作用完全不同。,C+实用教程,19,例Ex_StaticS
11、cope 使用静态类型的全局变量,Ex_StaticScope.cpp #include stdafx.h #include using namespace std; int n; void f(); int main() n = 20; coutn = nn; f(); return 0; ,Ex_StaticScope_1.cpp #include stdafx.h #include using namespace std; static int n; void f() n+; coutn = nn; ,C+实用教程,20,9.2.4 外部类型,使用关键字extern声明的变量称为外部变量
12、。 当某个变量被声明成外部变量时,不必再次为它分配内存就可以在本程序中引用这个变量。 在C+中,只有两种情况需要使用外部变量: 在同一个源文件中,若定义的变量使用在前,声明在后,这时在使用前要声明为外部变量。 当由多个文件组成一个完整的程序时,在一个源程序文件中定义的变量要被其他若干源文件引用时,引用的文件中要用extern对该变量进行外部声明。,C+实用教程,21,例Ex_Extern1 同一个源文件中的外部变量使用,#include using namespace std; extern int a;/ 声明外部变量a, void count() a+; coutan; int a = 1
13、0;/ 外部变量a的实际定义处 int main() count(); coutan; return 0; ,C+实用教程,22,例Ex_ Extern2 不在同一个源文件中的外部变量的使用,Ex_Extern2.cpp #include stdafx.h #include using namespace std; extern int n;/ 外部变量声明 void f() n+; coutn = nn; ,Ex_Extern2_1.cpp #include stdafx.h #include using namespace std; int n; void f(); int main()
14、n = 20; coutn = nn; f(); return 0; ,C+实用教程,23,9.1 作用域和可见性 9.2 内存区和存储类型 9.3 编译预处理 9.4 名称空间,C+实用教程,24,9.3 编译预处理,编译预处理命令是在程序编译的时候被执行的。 编译预处理命令在程序中都以“#”来引导,每一条预处理命令必须单独占用一行,它不是C+语句,在结尾没有分号“;”。 编译预处理命令扩展了C+程序设计的能力,可以使用户编写的程序更便于阅读、修改、移植和调试。 C+提供的预处理命令主要有三种:宏定义命令、文件包含命令、条件编译命令。,C+实用教程,25,9.3.1 宏定义,宏定义是用一个指
15、定的标识符来代替一个字符串。它有两种形式:不带参数的宏定义和带参数的宏定义。,#define 字符串 #define (参数名表) 字符串 #undef,#define PI 3.141593 #define PI 3.14ABC593 #defineWIDTH 80 #defineLENGTH (WIDTH+10),#define MAX(a,b) (a)(b)?(a):(b) x=MAX(3,9) /序列替换: x=(a)(b)?(a):(b) /参数替换: x=(3)(9)?(3):(9) /计算: x=9,#define AREA(r) (3.14159*r*r) x=AREA(2+3
16、) /序列替换: x=(3.14159*r*r) /参数替换: x=(3.14159*2+3*2+3) /计算:,C+实用教程,26,9.3.2 条件编译命令,条件编译使同一源程序在不同的编译条件下得到不同的目标代码。,(1)第一种形式 #ifdef #else #endif,(2)第二种形式 #ifndef #else #endif,(3)第三种形式 #if #elif . #else #endif,C+实用教程,27,例Ex_UseIfdef 使用#ifdef条件编译命令,#include using namespace std; #define LI int main() #ifdef
17、LI coutHello, LI!n; #else coutHello, everyone!n; #endif return 0; ,Hello, LI,C+实用教程,28,例Ex_UseIf 使用#if条件编译命令示例,#include using namespace std; #define A -1 int main() #ifA0 cout0n; #elif A0 couta0n; #else couta=0n; #endif return 0; ,程序运行结果如下:a0 若将#define A -1改为 #define A 0 程序运行结果如下:a=0,C+实用教程,29,9.3.3
18、 文件包含命令,C+提供#include命令实现文件包含操作,它有标准方式和用户方式两种格式。 要注意如下两点。 一条#include命令只能包含一个文件,若想包含多个文件须用多条包含命令一一指定。 在ANSI/ISO C+中,#include后面的文件名不再有.h扩展名,取而代之的是直接使用文件名,如以前的程序中iostream是C+头文件的文件名。,#include #include 文件名,C+实用教程,30,头文件内容,可以包含 全局数据声明 extern int n; 函数声明 void fn(); 类型声明 class Student; 全局常量定义 const float pi=
19、3.14; 内联函数定义 inline void fn() . 模板声明和定义 template class A. 名空间定义 namespace N. 类型定义 enum COLOR; class A; 预编译指令 #include 注释 /*.*/ /. 不可以包含 全局数据定义 int n; 函数定义 void fn() .,C+实用教程,31,9.3.4 文件重复包含处理,文件重复包含在比较大的程序中经常出现。 一种方法是将头文件中的代码使用条件编译命令来限定。,C+实用教程,32,9.3.4 文件重复包含处理,另一种方法是使用预编译命令#pragma once,用它指定文件只被编译器包含一次。,C+实用教程,33,9.1 作用域和可见性 9.2 内存区和存储类型 9.3 编译预处理 9.4 名称空间,C+实用教程,34,9.4 名称空间,在C+中,名称可以是变量、函数、结构、枚举、联合及类的名字等。 随着程序代码的增多,名称相互冲突的可能性也将增加。 解决名称空间问题的方法是使用C+新的名称空间特性,通过名称空间的作用域机制来解决。,C+实用教程,35,1. 名称空间的定义,同一个文件中,允许定义多个名称空间。 一旦定义名称空间,标识符就标识了名称空间体的那个区域。,namespace 标识符 成员; ,体,C+实用教程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业活动策划外包合同
- 酒店维修人员外包合同
- 上海公立医院外包合同
- 工会活动场所外包合同
- 空间数据标准外包合同
- 景观设计人员外包合同
- 催化剂检修维护外包合同
- 房建工程劳务外包合同
- 车间设备喷漆外包合同
- 怀化市劳务派遣外包合同
- 鄂尔多斯市2026年初三二模英语试卷(含答案)
- MOOC 电路基础-西北工业大学 中国大学慕课答案
- 煤矿机电运输安全管理培训课件
- GB/T 2820.6-2009往复式内燃机驱动的交流发电机组第6部分:试验方法
- GB/T 1184-1996形状和位置公差未注公差值
- 对歌曲《军营飞来一只百灵》中的花腔部分演唱分析与体会
- 2022年南靖县荆江国有资产投资有限公司招聘笔试题库及答案解析
- 金坛区苏科版五年级心理健康教育全一册全部教案(一共18课;定稿)
- 东河流域水电梯级开发规划报告修订本定
- 船舶建造技术水平评价指标体系
- 《汉服》PPT课件(完整版)
评论
0/150
提交评论