c++基础(3.5)预处理:宏、文件包含、条件编译
2018-03-05 21:57
567 查看
宏定义相关注意点
1.不带参数的宏定义:
(1)宏名一般用大写(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义(3)可以用#undef命令终止宏定义的作用域(4)宏定义可以嵌套2.带参数的宏定义:
(1)实参如果是表达式容易出问题#define S(r) r*rarea=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;正确的宏定义是#define S(r) ((r)*(r))(2)宏名和参数的括号间不能有空格(3)宏替换只作替换,不做计算,不做表达式求解(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存(5)宏的哑实结合不存在类型,也没有类型转换。(程的引用就是调用一个过程。建立过程的目的就是建立可多次重复执行的程序段,以便多次调用它们。通常过程是带有参数的,在Fortran中把参数称为变元(实元或哑元),过程定义中的变元是哑元,过程引用中的变元是实元。在调用过程时,要用实元代替哑元,这就是哑实结合。
哑实结合必须遵循三个一致的原则,否则运行出错:哑元与实元位置一致;哑元与实元个数一致;哑元与实元类型一致。这就要求记住每个哑元的名及其位置,阅读实元表时对其中每个表达式要追溯到它原来的哑元是什么,非常不便,为此F90可以通过如下方法放宽这三个一致的原则:用关键字变元放宽位置一致;用可选择变元放宽个数一致;用类属过程放宽类型一致。)
(6)宏展开(预处理(预编译)工作)使源程序变长,函数调用不会(7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
文件包含相关注意点
(1)编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。
(2)文件1包含文件2,文件2用到文件3,则文件3的包含命令#include应放在文件1的头部第一行;(3)包含可以嵌套;(4)<文件名>称为标准方式,系统到头文件目录查找文件,"文件名"则先在当前目录查找,而后到头文件目录查找;(5)被包含文件中的静态全局变量不用在包含文件中声明。
条件编译
有些语句希望在条件满足时才编译。格式:(1)#ifdef 标识符程序段1#else程序段2#endif或#ifdef程序段1#endif当标识符已经定义时,程序段1才参加编译。格式:(2)#ifndef 标识符#define 标识1程序段1#endif如果标识符没有被定义,则重定义标识1,且执行程序段1。格式:(3)#if 表达式1程序段1#elif 表达式2程序段2……#elif 表达式n程序段n#else程序段n+1#endif当表达式1成立时,编译程序段1,当不成立时,编译程序段2。使用条件编译可以使目标程序变小,运行时间变短。预编译使问题或算法的解决方案增多,有助于我们选择合适的解决方案。此外,还有布局控制:#pragma,这也是我们应用预处理的一个重要方面,主要功能是为编译程序提供非常规的控制流信息。
1.不带参数的宏定义:
(1)宏名一般用大写(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义(3)可以用#undef命令终止宏定义的作用域(4)宏定义可以嵌套2.带参数的宏定义:
(1)实参如果是表达式容易出问题#define S(r) r*rarea=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;正确的宏定义是#define S(r) ((r)*(r))(2)宏名和参数的括号间不能有空格(3)宏替换只作替换,不做计算,不做表达式求解(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存(5)宏的哑实结合不存在类型,也没有类型转换。(程的引用就是调用一个过程。建立过程的目的就是建立可多次重复执行的程序段,以便多次调用它们。通常过程是带有参数的,在Fortran中把参数称为变元(实元或哑元),过程定义中的变元是哑元,过程引用中的变元是实元。在调用过程时,要用实元代替哑元,这就是哑实结合。
哑实结合必须遵循三个一致的原则,否则运行出错:哑元与实元位置一致;哑元与实元个数一致;哑元与实元类型一致。这就要求记住每个哑元的名及其位置,阅读实元表时对其中每个表达式要追溯到它原来的哑元是什么,非常不便,为此F90可以通过如下方法放宽这三个一致的原则:用关键字变元放宽位置一致;用可选择变元放宽个数一致;用类属过程放宽类型一致。)
(6)宏展开(预处理(预编译)工作)使源程序变长,函数调用不会(7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
文件包含相关注意点
(1)编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。
(2)文件1包含文件2,文件2用到文件3,则文件3的包含命令#include应放在文件1的头部第一行;(3)包含可以嵌套;(4)<文件名>称为标准方式,系统到头文件目录查找文件,"文件名"则先在当前目录查找,而后到头文件目录查找;(5)被包含文件中的静态全局变量不用在包含文件中声明。
条件编译
有些语句希望在条件满足时才编译。格式:(1)#ifdef 标识符程序段1#else程序段2#endif或#ifdef程序段1#endif当标识符已经定义时,程序段1才参加编译。格式:(2)#ifndef 标识符#define 标识1程序段1#endif如果标识符没有被定义,则重定义标识1,且执行程序段1。格式:(3)#if 表达式1程序段1#elif 表达式2程序段2……#elif 表达式n程序段n#else程序段n+1#endif当表达式1成立时,编译程序段1,当不成立时,编译程序段2。使用条件编译可以使目标程序变小,运行时间变短。预编译使问题或算法的解决方案增多,有助于我们选择合适的解决方案。此外,还有布局控制:#pragma,这也是我们应用预处理的一个重要方面,主要功能是为编译程序提供非常规的控制流信息。
相关文章推荐
- C++编译预处理:宏定义指令、文件包含指令和条件编译指令
- C/C++编译预处理:宏定义指令、文件包含指令、条件编译指令和特殊符号处理
- 三种预处理功能 : 宏定义 --文件包含 -- 条件编译 import include 常用c/c++库
- C++编译预处理:宏定义指令、文件包含指令和条件编译指令
- C++编译预处理:宏定义指令、文件包含指令和条件编译指令
- c语言的预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含
- C 预处理(宏定义,文件包含,条件编译)
- 15-预处理指令1-宏定义、条件编译、文件包含
- 预处理(宏定义、文件包含、条件编译)
- 预处理(宏定义、文件包含、条件编译)
- C语言预处理指令:宏、条件编译、文件包含
- IOS开发---C语言-㉑预处理指令:宏定义、条件编译、文件包含
- C++的基础知识(六)--条件编译及编译预处理阶段
- 预处理 之 宏定义、文件包含、条件编译
- c语言三种预处理--宏定义,文件包含,条件编译
- C++头文件与多文件结构,编译预处理
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
- C语言学习入门 (六) 预处理指令:宏、条件编译、文件包含
- c/c++预处理过程详解(一)之文件包含、宏定义
- C++生成二级制文件过程(预处理->编译->链接 )