黑马程序员 C语言------预处理指令学习

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------- 


预处理指令

 预处理指令 分3种

 >宏定义

 >条件编译

 >文件包含

 

 预处理指令是在代码翻译成0跟1之前执行的

 > 所有的预处理指令都是以#号开头的

 运行顺序:   源文件-->预处理-->汇编-->二进制-->链接(可执行文件)-->运行

#define 宏名 值

例如:#define age 24

 宏定义干什么? 在代码翻译成0跟1之前,把所有的宏名替换为值(宏定义只做一个单纯的替换操作)

 注意: 宏名和值之间要用空格隔开

      宏定义后面不需要写分号

      如果把宏名写在双引号中在代码翻译成0跟1之前不会进行替换

      一般宏名都大写,为了和局部变量区分开来

      宏名除了用大写 还可以用k开头

 宏定义的作用域:

  从定义的那一行开始一直到文件结束

  宏定义的位置随便写

可以使用#undef来提前结束宏定义的作用域

02-带参数的宏定义:

注意:

 宏名后面的()中不需要写参数类型

 ()和后面要替换的格式之间要用空格隔开

带参数的宏定义和函数的区别:

     宏定义不会进行运算,你传什么他就会给你替换成成什么

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

     因为带参数的宏定义是在运行之前就替换好了,运行的时候只需要做一个运算

     而函数是在运行的时候才去找到函数并运算

     应用场景:做一些简单的运算用宏定义, 如果做一些复杂的运算就用函数

注意点

写带参数的宏定义一般会给每一个参数都加上括号

写带参数的宏定义不仅要给每一个参数加上括号还要给整体也加上括号

  例如   #define PF(v1) ((v1)*(v1))

 03-条件编译

如果定义了A这个宏 就编译#ifendif之间的代码

#if defined(B)

    printf("aaaaa\n");

#endif

    如果没有定义A这个宏就编译#ifendif之间的代码

#if !defined(A)

    printf("bbbbbb\n");

#endif

注意点: 在编写条件编译的时候一定要在后面加上 #endif

#endif 的作用是告诉条件编译什么时候结束

static-extern对函数的作用

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

 1> 默认情况下所有的函数都是外部函数

 2> 在不同文件中不能有相同名称的外部函数

 

 extern的作用:

 1> 完整的定义一个外部函数

 2> 完整的声明一个外部函数

 

 

 内部函数:定义的函数只能被本文件访问

 1> 不同文件中可以有相同名称的内部函数

 

 static的作用:

 1> 定义一个内部函数

 2> 声明一个内部函数

static-extern对全局变量的作用

 全局变量分为2:

 1.>外部全局变量

    >在本文件和其它文件中都可以访问的全局变量称之为外部全局变量

    >不同文件中的外部全局变量代表着同一块存储空间

    >所有同名的全局变量都代表着同一块存储空间

 

 2.>内部全局变量

    >只能在本文件中访问的全局变量称之为内部全局变量

 

 extern对全局变量的作用:

 用来"声明"一个外部全局变量

 

 static对全局变量的作用:

 用来定义一个外部全局变量

默认情况下所有的全局变量都是外部全局变量

所有同名的全局变量都代表着同一块存储空间

static对局部变量的作用

普通局部变量和静态局部变量的区别

     1.存储空间不一样

     2.普通局部变量没有显示初始化没有固定的初始化值,

     而静态局部变量如果没有显示初始化有固定初始化值,默认就是0

     3. 用static修饰局部变量,会延长局部变量的生命周期,但不会改变TA的作用域

static修饰局部变量的使用场合:

 1.如果某个变量调用频率非常高,而且这个变量的值是固定不变的,就可以使用static来修饰该局部变量,提高性能

typedef基本概念

typedef的作用:给现有的数据类型起一个外号(别名)

 > 有利于加强数据类型的描述性提高了代码的可读性

 > 提高了程序的可扩展性移植性

 > 减少了代码的书写工作量简化了代码

例如:定义一个结构体

typedef struct Person

{

   int age;

   char *name;

} StrPerson;

StrPerson p = {44,"lf"};//定义一个结构体变量


例如:   typedef char * String;

  String == char *   // String相当于一个类型

 char *name  ==  String name

 注意点:

 typedef 仅仅是给原有的数据类型起了一个别名,并不是创建一个新的数据类型

注意点:如果通过typedef给指向函数的指针起别名 指针变量的名称就是别名

typedef不仅可以写在函数外面还可以写在函数里面,只要在使用别名之前定义就OK


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------- 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值