黑马程序员-C语言预处理

本文详细介绍了C语言的预处理概念,包括宏定义、条件编译、文件包含、类型定义typedef以及static和extern的用法。讲解了宏定义如何替换代码,条件编译如何根据宏判断选择性编译,文件包含的注意事项,以及typedef创建类型别名的方法。同时,阐述了static和extern在函数和变量上的影响,特别是static如何改变局部变量的生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.预处理指令:
      定义:1>预处理指令是在程序开始编译前就已经编译完毕了。预处理指令
                2>全部是#开头。
     分类: 宏定义、条件编译、文件包含
     作用域:从编写指令开始,一直到文件结尾。

2.宏定义(替换代码)
 关键词:#define 宏名 值    (宏定义只负责换代码,并不负责运算   值中每个参数要加( ))
   eg:#define count 4  //会将程序中所有count 转化成4  如果代码中是“count” 则此count不会被替换
    #undef  取消define宏的作用。
    注:宏名使用大写,变量名用小写。eg:#DEFINE

3.条件编译(文件编译时存在)
    #if()
        A //如果只编译了A,则下面的B和C不会保存在内存中 
    #elif()
        B
    #else()
        C
    #endif  
 注:1>条件编译只编译宏中定义的语句,且如果elif或else没有判断,则此没有保存在内存中(不参与编译的不会保存在内存中)。
        2>endif必须添加
 #if defined() 相当于 #ifdef
#if undefined 相当于#ifndef

4.文件包含
    注:不允许循环包含(互相包含)。
 防止多次包含方法:
  #ifndef  ...
   #define  ...
         .....
 #endif

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


5.类型定义 typedef (取别名)
    eg:#typedef int myint;    将int类型的别名定义为myint
    使用场合:
        1>基本数据类型
            typedef int myint;
        2>指针
            typedef  char *  p;//p是名字
        3>结构体
            typedef struct student
                {
                int age;
                } stu;   //类型名是stu
            (1)定义结构体的指针:
                typedef struct student  * p;//p是名字
        4>枚举    
        5>指向函数的指针
                typedef int (*name)(int , int) //name是定以后的名字

6.static和extern
    6.1对函数的影响
     外部函数:定义的函数能被本文件和其他文件访问。(函数默认为外部函数)(其它文件可访问)
        注:外部函数不能有重名
     内部函数:定义的函数只能被本文件访问,其他文件不能访问。(只有本文件访问)
         注:内部函数可以不同文件中函数重名
     extern:声明或定义此函数是外部函数。
        eg:extern void test();
     static:声明或定义此函数是内部函数。

    6.2 对变量的影响
        全局变量分类:
            外部变量:定义的变量能被本文件和其他文件访问。(其它文件可访问)
                注:不同文件中的同名外部变量,都代表着同一个变量。
            内部变量:定义的变量只能被本文件访问(只有本文件访问)

      static对局部变量影响
            (1)延长局部变量生命周期,局部变量就不会随着函数调用结束就被销毁,而是等到程序结束后才被销毁。
       (内存空间中一直有此变量)    
            (2)没有改变局部变量的作用域。

        使用范围:
            (1)某些变量值保持不变。
            (2)某些变量值使用频繁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值