C基础补漏--01关键字define

#define
在大规模开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译
#ifdef WINDOWS

,
#endif
#indef LINUX

,
#endif

替代宏的方式
1、C++中用const 来代替宏常量
2、使用inline来代替宏函数
3、使用typedef来代替define定义的类型
4、使用enum来代替定义多个宏常量,并且enum定义的常量可读性更高

优点

1.速度快,不占用系统内存

缺点:

1.不会对类型进行检查
2.未加括号存在边界效应
C基础补漏--01关键字define

**

define 小测试

C基础补漏--01关键字define

define 与const 区别:

  1. define 再系统编译时会全部进行替换,而且没有对类型进行检查 ,运行时不会分配内存,不占用内存空间
  2. const的类型不匹配时,系统在运行时会发现并提示报错const的类型不匹配时,系统在运行时会发现并提示报错,在运行期间 const变量仍是变量,系统会分配其内存

**

define 宏与函数的区别:

来源:https://blog.csdn.net/sustzc/article/details/80146855
1.执行速度与效率
define 的效率高,在预处理阶段完成 ,在编译的过程中,系统会直接替换;
函数的话:
一开始要在栈中开辟空间,
再调用函数时执行逻辑部分,同时保存调用函数地址
函数调用结束后根据保存地址返回之前函数调用的地方
2.调试
define 不方便调试,在编译时,预处理阶段就被编译器替换掉,编译报错,通常不是真正错误的地方,
函数由于在程序运行中被处理,容易调试
3.代码长度
预处理阶段,#define宏将会被替换,当宏特多,代码长度增加
函数,只有在调用时才会使用定义函数的代码,函数调用结束后会释放调用期间开辟的空间,不影响代码长度
4.参数类型
宏可以用于任何合法的参数类型
函数的参数与类型有关,参数的类型不同,就需要不同的函数。
函数传参数不可以传递类型
C基础补漏--01关键字define
5.操作符优先级
define 只是替换,在这里容易引发错误
函数的参数只在函数调用时求值一次,并将结果传递给函数即可
C基础补漏--01关键字define
6 参数求值
C基础补漏--01关键字define

**

define用法

来源:https://blog.csdn.net/king110108/article/details/80728010
eg:
1)得到制定地址上的一个字节或字
#define MEM_B(x) (((byte )(x)))
#define MEM_W(x) (
(word*)(x))
2)求最大值
#define MAX(x,y) ( ( (x)>(y) ) ? (x):(y) )
#define MAX(x,y) ( ( (x)<(y) ) ? (x):(y) )
C基础补漏--01关键字define
C基础补漏--01关键字defineC基础补漏--01关键字define
19.宏跟踪调试
AMSI标准–5个预定义宏名
LINEFILEDATATIMESTDC
c++ 还增加了 __cplusplus
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,LINE,FILE)
C基础补漏--01关键字define

define的应用

1)define的变体,即#ifndef
可以防止头头文件的重复引用
C基础补漏--01关键字define
每个头文件的这个“标识”都应该是唯一的;标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线
C基础补漏--01关键字define
2)简单的define定义
#define MAXTIME 1000
if(i<MAXTIME){…}
3)define 的函数定义
为了得到想要的效果,应在每一个变量上加括号,以免产生边界效应
#define max(x,y) (x)>(y)?(x):(y);
C基础补漏--01关键字define
C基础补漏--01关键字define
4)函数的单行定义与多行定义
C基础补漏--01关键字define
5)定义宏#define,取消宏#undef—条件编译
C基础补漏--01关键字define

10 #define 的特殊标识符

C基础补漏--01关键字define
C基础补漏--01关键字define