C基础——预处理



1.预处理指令:
  定义:1>预处理指令是指将代码翻译成0和1之前执行的指令。
        2>全部是#开头,预处理指令位置可以随便写。
  分类: 宏定义、条件编译、文件包含
  作用域:从编写指令开始,一直到文件结尾。

2.宏定义(替换代码)
 关键词:#define 宏名 值    (宏定义只负责换代码,并不负责运算,值中每个参数要加( ))
 例如:#define count 6  //会将程序中所有count 转化成4  如果代码中是“count” 则此count不会被替换
    #undef  宏名 :从这行开始,取消define宏的作用。
    注:宏名一般使用大写(或者以K开头),变量名一般用小写。eg:#DEFINE
eg:
#define pingfang(a) (a*a)//只是换代码,纯文本替换;
#include "stdio.h"
int main()
{
    int c = pingfang(5+5);//纯文本替换即:每个a都替换成5+5,结果为5+5*5+5=35
    printf("c is %d\n", c);
    return 0;
}
输出为:c is 35。

3.条件编译
只有满足条件的语句才参与编译,不满足的条件语句不参与编译;只要写了#if,后面一定要加上#endif。
    #if()
        A //如果只编译了A,则下面的B和C不会保存在内存中 
    #elif()
        B
    #else()
        C
    #endif  //表示条件编译到此结束
 注:1>条件编译只编译宏中定义的语句,且如果elif或else没有判断,则此没有保存在内存中(不参与编译的不会保存在内存中)。
     2>endif必须添加
     #if defined() 相当于 #ifdef
     #if undefined 相当于#ifndef
eg:
#include "stdio.h"
#define  A 10
int main()
{
    #if(A==10)
        printf("%d",A);
    #elif(A==5)
        printf("%d", A);
    #else
        printf("%d",A);
    #endif
    return 0;
}

4.文件包含
 
 注意:1> #include后面<>表示系统自带的文件,""表示自定义文件;
       2> 不允许循环包含,比如a.h包含b.h,b.h又包含a.h。
 防止多次包含方法:
  #ifndef  ...
  #define  ...
         .....
  #endif

eg: #idndef _TEST  // 如果没有定义_TEST,则会运行以下,就是声明test( )函数,如果定义了,就不会进行声明,防止了文件重复包含
    #define _TEST
       test();
    #endif

5.类型定义 typedef (取别名)
作用:给已经存在的类型起一个新的名称。
eg:
#include<stdio.h>
typedef int myint;<span style="color: rgb(38, 38, 38); font-family: 微软雅黑; font-size: 14px; line-height: 21px;">//将int类型的别名定义为myint,此时myint就代表int类型。</span>这条语句也可以放在main函数里.
int main()
{
      myint i = 10;
      printf("%d",i);//输出10
      return 0;
}
    
使用场合:
    1>基本数据类型
          typedef int myint;
    2>指针
          typedef  char *  p;//给指针类型char *取了一个新的类型名p
    3>结构体     
    <span style="font-family: 微软雅黑;">typedef struct student</span><pre name="code" class="objc">         {
            int age;
         };
typedef struct student myStu; //类型名是myStu;
 
  
     或者
   typedef struct student
         {
            int age;
         }myStu;//做了两件事情,1、定义了结构体student;2、将struct student改名为myStu。
    (1)定义结构体的指针:
         typedef struct student  * p;//p是名字
     4>枚举  
type enum Sex 
{
    man,
    woman,
}MySex;
     5>指向函数的指针
         typedef int (*name)(int , int) //name是定以后的名字

6.关键字static和extern
    1> 对函数的影响
     外部函数:定义的函数能被本文件和其他文件访问。 (函数默认为外部函数)(其它文件可访问)
        注:外部函数不能有重名
     内部函数:定义的函数只能被本文件访问,其他文件不能访问。(只有本文件访问)
          注:内部函数可以不同文件中函数重名
     extern: 完整的声明和定义一个外部函数。 extern可以省略,默认情况下声明和定义的都是外部函数。
     static:完整的声明和定义一个内部函数,static不能省略。
 eg:extern
//one.c
#include<stdio.h>
//完整的定义一个外部函数
extern void test()
{
    printf("哈哈");
}

//main.c
#include<stdio.h>
extern void test();//完整的申明一个外部函数
int main()
{
      test(); //因为test为外部函数,所以可以在main文件中直接调用,输出”哈哈“
      return 0;
}

    2> 对变量的影响
     全局变量分类:
         外部变量:定义的变量能被本文件和其他文件访问。默认情况下所有全局变量都是外部变量且初值为0, (其它文件可访问)
             注:不同文件中的同名外部变量,都代表着同一个变量。
         内部变量:定义的变量只能被本文件访问 (只有本文件访问)

     外部变量:
     1> 默认情况下所有的变量都是外部变量;
     2> 不同文件中的同名外部变量都代表着同一个变量;
     3> 定义外部变量前不要加extern,直接 int a;就可以了;
     4> e xtern对变量只有一个作用:申明一个外部变量。
     5> 外部变量可以放在函数外,也可以放在函数内,放在函数内时,extern不能丢,否则就变成重新定义一个新变量了。
      
     内部变量:
      static的作用只有一个:定义一个内部变量, 只能在本文件中访问。
     static对局部变量影响
     (1)延长局部变量生命周期,局部变量就不会随着函数调用结束就被销毁,而是等到程序结束后才被销毁。 (内存空间中一直有此变量)    
     (2)没有改变局部变量的作用域。
  eg:  
int test()
{
    int a; //函数调用完之后,a就会被销毁,下次再调用的时候,会重新定义赋值
    a++;
    printf("%d",a);

   static int b = 0; //第一次调用的时候会分配存储空间,但是函数调用完之后,b并不会被销毁,再次调用时会在原来的基础之上,再次执行,直到程序结束的时候,变量才被销毁。
   b++;
   printf("%d",b);

}
 int main()
{
     test();
     test();
     return 0;
} //此时a0,b=1
<span style="background-color: inherit; font-family: 微软雅黑;">     static修饰局部变量的使用场合:</span>
     (1)如果某个变量的调用频率特别高。
     (2)某个函数内部的某个变量值是固定不变的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值