宏定义和自定义函数

宏定义函数和自定义函数:
在预处理阶段要处理哪些东西?
1、头文件:#include ....   //#include <stdio.h>   #include "stdio.h"
2、宏定义:#define ...
3、注释;
4、条件编译:#if ...  #elif ... #endif
总结一下:带#都是在预处理阶段处理的!


宏定义怎么定义:
#define 宏定义变量名  宏定义本质上的内容   //注意的是:没有分号!
为什么需要宏定义;
1、修改方便,减少很多不必要的工作量;
2、防止出错!


宏定义函数和自定义函数的区别:
1、宏定义是在调用的地方原地展开;
  自定义函数是跳转到函数定义的地方调用,调用结束之后再返回到函数调用的地方;
  ===》带来的实质区别是:
  ===》宏定义函数没有调用开销,而自定义函数是需要有调用开销的(需要保存现场,有入栈
和出栈的操作)
  ===》宏定义函数不需要进行参数类型的检查,也没有返回值类型;但是自定义有参数类型的
  ===》检查和返回值类型的检查!这个检查是由编译器完成的,如果调用的时候传入的实参和
  ===》函数的形参不一样的话,要么报警告要么报错!【会提示你发生了错误】


什么时候用宏定义函数,什么时候用自定义函数?
1、函数体比较简单的时候,不需要进行参数类型检查的时候,可以用宏定义函数!
2、函数体比较复杂,需要进行参数类型检查和返回值类型判断的时候,用自定义函数!


有没有一种手段可以兼具宏定义函数和自定义函数的优点?
  ==》既可以进行参数类型和返回值类型的检查,又可以进行原地展开!
  ==》内联函数!
  ==》在函数定义的时候,在前面加上inline关键字;不是在函数声明的时候添加;
  ==》请求编译器在编译的时候,将这个函数当成是“内联函数”来编译!
  ==》既然是请求的话,编译器一般都会拒绝!因为如果当成是“内联函数”来编译的话,放到
  ==》“符号表”里面,会浪费内存!
  ==》在C语言里面其实是没有“内联函数”的! ===》C++的时候是有内联函数!


//自带的内联函数:两个_ _组成的!
printf("%d\n",__LINE__); //打印当前行数;
printf("%s\n",__func__); //打印当前所在的函数;
printf("%s\n",__TIME__);
printf("%s\n",__DATE__); 


#define和typedef;
共同点:都可以对其他内容进行重命名;
#define dint int
typedef int tint;


#define dint int*
typedef int* tint;
区别:
1、dint c,d; //int* c,d; c是int *;d是int;
   tint e,f; //e和f都是int *;


2、 unsigned dint g; //unsigned int * g;   OK
// unsigned tint h; //unsigned int * h;  error;
define的类型可以和unsigned之类的其他类型进行组合;
typedef就不可以!
3、本质上是define只是进行单纯的替换;
define是在预处理阶段处理;
typedef是在编译阶段进行处理;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值