首先明确的时,在程序的预处理时,C语言的宏定义是直接在程序中展开,而C++的inline及既可能展开,也可能不展开(取决于你的编译设置,inline内的代码数量)
先来说明C中的宏定义:
1.定义常量
#define MAX 100 —— 这就像是把 MAX 这个名称 直接当作 100 来处理
比如: int (*arr[MAX])(int,int) 这个在预处理阶段就会变成 int(*arr[100])(int,int)
值得一提的是,这个并不是只能用于替换数字,而是所有都可以进行替换,
比如 #define YOU xiaoming 在后面的阶段中YOU 都会变成 xiaoming
2.带参数的宏定义
#definename( parament-list ) stuf
值得注意的是(parament-list)应该于与name紧靠在一起,否则会被认为是stuff中的部分
e.g #define ADD(x,y) ((x)+(y)) ——这就是代表后面只要输入了ADD(x,y)就会认为是将x,y 进行相加
比如 printf("%d",ADD(3,4));——就会编译出 7
以上就是宏定义了,接下来讲一下这其中容易出现的小错误
1. #define MAX 1000;
这里的问题是这里会把 ' ; '也直接弄过去,容易出错,比如printf("%d",MAX); 在于处理时就会变成 printf("%d",1000;); 出现error
2.#define ADD(x,y) x+y
这里的问题是 ADD(3==4,5*5) —— 3 == 4+5*5 ->0,可是我想要的结果应该是 25
3.#define ADD(x,y) (x+y)
这里的问题和上面相似,
所以在写带参数的宏定义时 #define ADD(x,y) ((x)+(y)) ,参数和结果都要带();
C++中的inline
结构
inline int ADD(int x,int y )
{
return x+y;
}
调用时,和函数相似,直接调用 ADD (x,y);
e.g
int ret = ADD(3,9);
return ret;
这样设计的初衷是防止在宏定义中的出错点,毕竟要是函数能写错,也是白学了!!
相比于宏定义的无条件展开,这里inline是有一定思想的,当你的代码量超过了一定行数,就不会在预处理阶段展开,(一般在5-10)毕竟要是很长你还展开的话就有点笨了。