函数与预编译.pptVIP

  • 0
  • 0
  • 约1.41万字
  • 约 92页
  • 2021-12-11 发布于广东
  • 举报
4.10.1 宏定义指令 1 不带参宏定义 用来产生与一个字符串对应的常量字符串,格式为: #define 宏名 常量串 预处理后文件中凡出现该字符串处均用其对应的常量串代替。替换过程称为宏替换或宏展开。例如,如果使用指令 #define PI 4.1415926 则程序中可以使用标识符PI,编译预处理后产生一个中间文件,文件中所有PI被替换为4.1415926。 宏替换只是字符串和标识符之间的简单替换,预处理本身不做任何数据类型和合法性检查,也不分配内存单元。 第六十一页,共92页 4.10.1 宏定义指令 2 带参数的宏定义 带参宏定义的形式很象定义一个函数,格式为: #define 宏名 ( 形参表 ) 表达式串 例如作如下宏定义: #define S(a,b) (a)*(b)/2 程序中可使用S(a,b),预处理后产生中间文件,其中S(a,b)被替换成(a)*(b)/2。注意,宏定义时形参通常要用括号括起来,否则容易导致逻辑错误。例如,如果定义: #define S(a,b) a*b/2 那么程序中的S(3+5,4+2)就会被宏展开为3+5*4+2/2,不符合定义的真正的意图。 带参宏定义形式上象定义函数,但它与函数的本质不同,宏定义仍然只是产生字符串替代,不存在分配内存和参数传递。 第六十二页,共92页 4.10.2 文件包含指令 文件包含用#include指令,预处理后将指令中指明的源程序文件嵌入到当前源程序文件的指令位置处。格式为: #include 文件名 或 #include ″文件名″ 第一种方式称为标准方式,预处理器将在include子目录下搜索由文件名所指明的文件。这种方式适用于嵌入C++提供的头文件,因为这些头文件一般都存在C++系统目录的include子目录下。而第二种方式编译器将首先在当前文件所在目录下搜索,如果找不到再按标准方式搜索。这种方式适用于嵌入用户自己建立的头文件。 第六十三页,共92页 一个被包含的头文件中还可以有#include指令,即include指令可以嵌套,但是,如果同一个头文件在同一个源程序文件中被重复包含,就会出现标识符重复定义的错误。例如:头文件f2.h中包含了f1.h,如果文件f4.cpp中既包含f1.h,又包含f2.h,那么编译将提示错误,原因是f1.h被包含了两次,那么其中定义的标识符在f4.cpp中就被重复定义。避免重复包含可以用条件编译指令。 4.10.2 文件包含指令 第六十四页,共92页 4.10.3 条件编译指令 1 用宏名作为编译的条件 格式为: #ifdef宏名 程序段1 [#else 程序段2] #endif 2 表达式的值作为编译条件 格式为: #if 表达式 程序段1 [#else 程序段2] #endif 当希望在不同条件下编译程序的不同部分。这种情况就要使用条件编译指令。 其中程序段可以是程序也可以是编译预处理指令。可以通过在该指令前面安排宏定义来控制编译不同的程序段。 第六十五页,共92页 4.4 函数调用机制 void fun1(int, int); void fun2(float); int main(){ int x=1;y=2; fun1(x, y); return o;} void fun1(int a,int b){ float x=3; fun2(x); } void fun2(float y) { int x; … } x 栈顶 栈底 y 3 fun2() fun1()运行状态及返回地址 x 3 b 2 a 1 fun1() main()运行状态及返回地址 y 2 x 1 main() 操作系统运行状态及返回地址 此图例说明在程序执行过程中怎样通过栈“动态”地建立和释放局部变量占用的内存的 第二十九页,共92页 4.5 作用域与标识符的可见性 3 文件作用域 2 函数声明作用域 作用域:指标识符能够被使用的范围。只有在作用域内标识符才可以被访问(称为可见)。 本节重点讨论局部域和文件域(全局域),其中局部域包括块域和函数声明域。任何标识符作用域的起始点均为标识符说明处。 下面分别介绍: 1 块作用域 第三十页,共92页 函数中定义的标识符,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作函数域。 块域 块指一对大括号括起来的程序段。块中定义的标识符,作用域在块内。 复合语句是一个块。 函数也是一个块。 复合语句中定义的标识符, 作用域仅在该复合语句中。 【例4.7】 输入两数,按从大到小的顺序保存。 块的引入: 第三十一页,共92页 块域 由VC+

文档评论(0)

1亿VIP精品文档

相关文档