C语言第四篇---预处理指令和static的作用
这是一个小插曲,原本这篇是OC第一篇的,但是C中还是提一下预处理这个概念,总结一下。
1.预处理指令:
预处理指令是在编译器翻译成0和1之前让C语言读取的一种指令,指令分为:宏、条件编译、
文件包含,三种指令,先说一说宏:宏分为不带参数的宏,和带参数的宏,宏定义就是替换C语
言中的文本,比如将C语言中的文本 TRUE 替换成1,之所以用到宏可以节省编译的时间,如果
在一个程序中经常用到某个数值或某个文本就可以用宏去代替。例如:
#define COUNT 6; //不带参数的宏
int main()
{
int a[COUNT];
return 0;
}
这里宏将数组中COUNT充当元素个数替换成6。那么说到定义,宏可以在任何位置定义,但
是前提是一定在用到宏之前定义,并且它的作用域是从定义开始到文件结尾。
还有一种带参数的宏,带参数的宏可以充当计算的作用,宏不是用来替换文本的吗,怎么可
以运算呢,看一下代码就知道了:
这里将cheng(3,5)直接替换成 (3)*(5) 这样间接的实现了运算,切忌在宏定义时,
#define cheng(n1,n2) ((n1)*(n2)) 后面要替换成的每一个数值都加上括号,否则后果不堪设想,例如:
int result=cheng(3,5);换成 int result=cheng(3+3,5+5); 如果不加括号它会这样替换:
int result=(3+3*5+5);结果就不是正确的了,因为宏知识单纯的替换文本而已,相比运算来讲宏
要节省内存,宏在编译前进行的文本替换,替换成了常量,因此不分配内存,如果不用宏,在代码
中需要定义变量分配内存。因此合理使用宏会更胜一筹。
条件编译就可以猜出来,选择性的编译,条件成立就编译,不成立就不编译。它的格式是:
#if 条件 .....
#elif 条件....
#endif
通常的来说条件编译的条件就是宏,在没有编译之前是没有任何变量的,这时宏可以充当条件
变量,由此这样一来程序的效率会很高,不成立的不参与编译,节省了编译的时间。但是需要注意
的是#endif必须要加,这时条件编译的结束标志,如果没有那么后面不管写多少代码都是不参与编
译的,后果是很严重的。
文件包含就是头文件,包含头文件就是对代码中函数的申明,一般情况下系统的头文件用<>括
起来,自己定义的头文件用""引起来。在函数申明时难免会不只一遍的包含头文件,为了发生这种情
况,在自己定义的头文件中加入这段代码即可:
#ifndef A
#define A
...
#endif
2.typedef类型:
typedef是给类型起个别名,比如给char起个Chr,以后再定义char类型变量时就可以直接用别
名 Chr 去定义了,typedef作用很实用,有时候我们不喜欢写一大堆定义类型的语句,比如结构体,
枚举,结构体指针,函数指针。这些在定义和使用时都很麻烦,这时就可以给它们起个别名,简化
代码量,减少工作量。例如:
typedef struct student
{
int age;
char name[10];
}myStu;
这就给定义的结构体类型起了个别名叫myStu,定义结构体变量就可以这样定义了:
myStu stu1={21,"minglei"}; 相比以前定义结构体变量要简单多了。似乎宏也可以完成,例如:
#define myStu struct student
{
int age;
char name[10];
};
这样也可以完成,只不过刚好反了过来。把myStu的地方全部替换成结构体,但是需要注意的
是如果是指针就不行了,例如:
#define String char *
ine main()
{
String a,b,c;
}
这里就有问题了,正常的思路是a,b,c都是字符指针,但是宏只是文本替换,替换是这样
的:char *a,b,c; 这里只有a是字符指针,b和c都是字符,因此宏不可以完全和typedef互换。
3.static修饰符:
static和extern是两个相对应的,static是定义和申明一个内部变量或函数,而extern是定义和
申明一个外部变量或函数,所谓的内部函数和变量是:只可以被本文件中的函数和变量所访问。
外部函数和变量是:可以被本文件或外部文件访问的函数和变量。extern是可以省略的,因此只要
没有static修饰的函数或变量都是外部函数或变量。static修饰局部变量还有一个用途,假如说我们
调用一个外部函数,这个外部函数调用完后会被销毁,但是我们不希望它的一个变量不销毁就可以
使用static去修饰它,static修饰局部函数,可以使它的生命周期延长。
总结:预处理命令、typedef、static都是很常用的,对我们编程有很大的帮助也是不可缺少的一
部分,有了它们的帮助使程序变得更精简,更高效,减少代码重复量。好了,向OC前进!