宏定义相关注意点
1.不带参数的宏定义:
(1)宏名一般用大写
(3)可以用#undef命令终止宏定义的作用域
(4)宏定义可以嵌套
2.带参数的宏定义:
#define S(r) r*r
area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;
(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,这也是我们应用预处理的一个重要方面,主要功能是为编译程序提供非常规的
控制流信息。