文档介绍:第十三章编译预处理和动态存储分配
编译预处理
编译之前,先对程序中特殊命令进行“预处理”,然后再进行通常的编译处理,得到目标代码。
C提供的预处理功能主要有以下三种:
;
;
。
宏定义
不带参数的宏定义
一般形式为# define 标识符字符串
如: # define PI
。
2. 便于记忆和书写。
。
例如,定义数组大小,可以用:
# define array_size 1000
int array [array_size];
要改变数组大小为5,只需改变#define 命令行即可.
,不作语法检查。
。
6. # define命令常写在文件开头。
带参数的宏定义
不是进行简单的字符串替换,还要进行参数替换。如:
# define S(a,b) a*b
......
area=S(3,2);
赋值语句展开为: area=3*2;
1. # define S(r ) PI*r*r
......
area=S(2+3);
宏展开为: area=PI*2+3*2+3; 与原意不符。
应改为:# define S(r ) PI*(r)*(r)
宏展开area=PI*(2+3)*(2+3); 得到正确结果。
,宏名和带参数的括号间不应加空格
3. 容易将带参数的宏和函数混淆。
“文件包含”处理
一般形式为: # include “文件名”
#include “”
B
B
A
=
A
几点说明:
,如果要包含n个文件,要用n个include命令。
2. 文件包含是可以嵌套的。如下面的例:
#include “”
B
#include “”
A
C
B
A
C
=
3. 在# include命令中,文件名可以用“”或< >括起来,如:# include “”或# include <> 都是合法的。
二者的区别是:用“”时,系统先在源文件所在目录中找要包含的文件,若找不到,再按系统指定的方式检索其它目录。而用尖括号时,不检查源文件所在目录而直接检索系统文件目录。
“”
动态存储分配
“静态存储分配”: 空间一经分配,在变量或数组的生存期内是固定不变的。
“动态存储分配”:在程序执行期间需要空间来存储数据时,通过“申请”分配指定的内存空间;当有闲置不用的空间时,可以随时将其释放.
#include <>
使用malloc()、calloc()分配空间
使用free()释放空间
例:动态分配空间存放整型数组,赋值并输出
#include <>
#include <>
void main()
{int size,*p;
cin>>size;
if((p=(int *)malloc(size*sizeof(int)) )==NULL) //分配内存
{cout<<can’t allocate more memory,terminating.\n”; exit(0); }
for(int c=0;c<size;c++) p[c]=c*2;
for(int c=0;c<size;c++) cout<<p[c]<<“”;
cout<<endl;
free(p); } //释放堆内存