一、C语言预处理指令
预处理指令包含三种分别是宏定义,条件编译,文件包含。(最后都没有分号)
预处理指令在代码翻译成1,0之前执行!预处理位置可以随便写。
但是他的作用域,从编写指令那行开始,一直到文件结尾。
1、宏定义分为两种(宏的效率比函数高)
掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”
1> 不带参数的宏定义(名字一般大写):
如 #define COUNT 4
2> 带参数的宏定义:
如:
#define sum( v1 , v2 ) v1 + v2; //调用的时候等于将左边的替换成右边的
调用的时候如果写成 sum( 2, 3 )* sum( 6, 4 ),
那么编译器会替换成 2+3 * 6+ 4 这样就违背了我们的原意。
所以我们再定义带参数的宏定义的时候,一般每个值都要加上一个括号,
如:#define pingfang(a) ((a)*(a))
2、条件编译
如:
#if (a == 10)
printf("a==10");
#elif(a == 5)
printf("a==5");
#else
printf("a==其他");
#endif
注意事项:
1> 因为条件编译时预编译,所以,一定要在他编译之前对A进行赋值,#define A 5
2> 一定要写#endif
3> 条件编译的几种用法:
(1)使用的时候有两种选择:#if defined (A)
# endif
或者 #ifdf A
# endif
(2) #if defined(A ) // 如果定义过A这个宏,就执行下面的代码,也可以写成#ifdf A(这样写不加加括号)
printf("A已定义过");
# endif
(3) #if !defined(A) //同样可以写成 # ifndf A
printf("A没有定义过");
# endif
3、文件包含
文件包含的时候,可能会因为遗忘等多次写入,浪费内存,所以为了确保文件只能被包含一次,我们可以在头文件中这样定义:
# ifndef ABC
#define ABC
int sum(int a, int b);
#endif //这样写进头文件,每次包含的时候,会判定是否已定义过ABC,如果已经定义过,那下面的就不会执行。
二、typedef
在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:
typedef int INT;
typedef int ARRAY[10];
typedef (int*) pINT;
typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。
2、typedef 与#define 区别
1> #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.
2>typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名.
3>还有typedef结尾需要加分号,但是#define 则不需要。
4>例子:
#define String2 char*//右边替换左边
typedef char * String;
String s1,s2;//这两个变量都是指针类型;
String2 s3,s4;//这里面相当于 char *s3,s4;//s4被定义成了char类型变量。
三、全局变量与局部变量
1、全局变量:定义在函数外面的变量,而且默认初始值就是0;
全局变量分为两种
(1)外部变量,默认所以文件的全局变量都是外部变量。而且不同文件的同名外部变量都代表着同一个变量。
(1)内部变量,只能被本文就访问, static int b;//定义一个内部变量。 只能当前文件使用。
【内部函数,外部函数同样如此】默认所有函数都是外部函数,所以可以省略extern。而内部函数,别的文件不能调用。
static对函数作用:1,定义一个内部函数,2声明一个内部函数。
extern对函数作用:1,完整的定义一个外部函数,2声明一个外部函数,但是可以省略。
2、局部变量:定义在函数内部,包括函数的形参,没有固定的初始值。
static对变量的作用:定义一个内部变量
extern对变量的作用:声明一个外部变量
3、static 和 extern
在C语言中,不同的代码以.c为界限分割开来,再单个.c文件中,有着不同的函数,main通过传递参数调用参数,来掌控整个程序有序运行,期间某个函数不想单纯听从main的指挥调度,于是树立了自己的政权static,static不用听从main的调度,自己做主,main也无奈,因为相对于static来说,extern更是让main难以掌控全局,因为不同的.c文件可以通过extern相互调用。
static要注意以下几点:
(1)static在main运行之前,就已经被分配,而且是在程序彻底退出之后才被释放。
(2)static变量有访问权限,在子函数里声明的static变量,只能在该函数内访问,如果static在函数体外声明,那他的访问权限就是本文件内。
(3)static不仅可以修辞变量,还可以修辞函数,如果来修辞函数,表示本函数访问权限在本源文件内。
extern:
extern是指当前变量或函数不是在本源文件内声明的,是外部变量或外部函数,“外来的和尚会念经”,能很好的体现extern的价值,当我们在本文件内试图使用一个外部声明的全局变量或函数时,可以在其前面加上extern,表示他是外来和尚。