C语言预处理指令

时间:2021-01-03 01:13:23

------期待与您交流! -------


一、预处理指令

   1. 预处理指令是在代码编译成0和1之前执行的

   2. 预处理指令的位置是随便写的

   3. 预处理指令都是以#开头的

   4. 预处理指令的作用域:从编写指令的那一行开始,一直到文件结尾

   5. 预处理指令分为三种:宏定义,条件编译,文件包含

二、宏定义(#define  宏名  值)

  1. #define    COUNT   5                    (宏名一般用大写,变量名一般都用小写)

      把所有的COUNT替换成5

  2. 例外:“”(双引号)之内的COUNT不会被替换

  3. 若想宏不生效,则在该处定义一个#undef COUNT取消宏定义的作用

  4. 带参数的宏

       #define sum(v1,v2)((v1)+(v2) )              // 用((v1)+(v2) )替换(v1,v2)

  5. 带参数的宏定义比函数效率高

  6. 宏定义只是文本替换

三、条件编译(有条件的编译某段代码)

  1. 格式

      # define  A     10                  //定义一个宏(因为宏是预处理指令,预处理指令是在编译之前才执行的)

      # if (条件)                       //条件判断宏的值

       {

       }

     #elif()

       { 

       }

     #else

       {

       }

     #end if                  

       只编译条件成立的这一句,其他的不编译

   2. 如果定义了一个宏:#if defined(A)   或者   #ifdef A

     如果没有定义一个宏:#if !defined(A)   或者   #ifndef A

   3. 使用了条件编译时,只要写了#if ,在最后面就必须写上#endif

四、文件包含(#include)

   1. #include <> 表示系统自带的文件

      #include" "  表示自定义的文件

   2. #include不允许循环包含(a.h包含b.h,b.h包含a.h 这样是不可以的)

五、typedef(类型

   1. typedef  int  MyInt           //给int起了个别名MyInt,实际MyInt就是int

      typedef  char*  string       //给指针起了个别名string 实际string就是char*

      typedef  struct student {int age;}mystu;或者typedef  struct student mystu;      //给结构体起了一个新名称

      typedef int(*test)(int,int)            //给指向函数的指针定义一个新类型,新类型的名称为(*test)

   2. typedef的作用:给已经存在的类型起一个新的名称

   3. 使用场合:基本数据类型,指针,结构体,枚举,指向函数的指针

   4. 使用注意

         #define string2 char*

          typedef char *string

              int main() 

                {

                      string  s1,s2            //s1,s2是指针

                      string2  s3,s4          //s3是char*指针 ,s4是个char

                }

六、static和extern

   1. 对函数的作用

  (1)用来完整的定义和声明一个外部函数(定义的文件能被本文件和其它文件访问)

          extern void test()       // 默认情况下,所以函数都是外部函数,external可省略

  (2)用来完整的定义和声明一个内部函数(定义的文件只能能被本文件访问,其它文件不能访问)

          static void test2()       //static不可省略,而且内部函数只能间接调用

  (3)外部函数不能同名,内部函数在不同文件中,允许同名

   2. 对全局变量的作用

  (1)全局变量可分为外部变量和内部变量

          外部变量:定义的变量能被本文件和其它文件访问

          内部变量:定义的文件只能被本文件访问和其它文件不可访问

  (2)默认情况下,所有外部变了都是全局变量

  (3)不同文件中的同名外部变量都代表同一个变量,不同文件中的同名内部变量,互不影响

  (4)static对变量的作用:定义一个内部变量

          extern对变量的作用:声明一个外部变量

   3. 对局部变量的作用:

        1>static修饰局部变量:(1)延长局部变量的声明周期,程序结束时,局部变量才会被销毁

                                         (2)并不会改变局部变量的作用域

        2> 使用场合: (1)如果某个函数的调用频率特别高

                             (2)这个函数的某个变量值是固定不变的

七、递归思想(用在函数中)

    递归的两个条件(1)函数自己调用自己

                              (2)必须有明确的返回值

     补充:C语言中的null相当于0,p=null(清空指针)