宏:只对程序其文本作用
-
注意宏中的空格(区分的关键) #define Func(x) (x*2+3)
例如:#define F (x) ((x)-1)
-
注意括号的安全使用
例如:
#define f(x)(x*x)
替换结果为:e=(a+b*a+b)*(c+d*c+d) = 5*34=170
#define f(x) x*x
替换结果为:e=a+b*a+b*c+d*c+d=1+2+12+24+4=43
#define f(x) ( (x)*(x) )
替换结果为:e=( (a+b)*(a+b)*(c+d)*(c+d) )=3*3*10*10=900
-
宏不是函数 #define abs(x) x>0?x:-x
例如: abs(a-b) <---> a-b>0?a-b:-a-b ERROR
所以每个元 都要加括号
#define abs(x) ( (x) >0 ? (x) : (-(x)) )
例如:abs(u8Data[i++]) 引入可变元之后导致展开的各项都做了重复操作 ERROR
-
宏不是语句
例如:#define assert(e) if(!e) assert_erroe(__FILE__, __LINE__)
TIP:
void (*p)():*p是一个指向函数的指针,表示是一个指向函数入口的指地变量,该函数的返回类型。
void *(*p)(void):函数返回值是void *指针类型。*p则是一个函数指针。括号中的void表示函数指针指向的函数参数为void。
void *p():是一个指针型函数,它的函数名为p,返回了一个指针,因为是void,这个指针没有定义类型,所以返回的是一个通用型指针。
-
宏不是类型定义
注:与typedef的区别
#define T1 struct foo *
typedef struct foo * T2;
----------------------------------------------------------------------------
T1 a,b; <!=> T2 a,b
struct foo * a,b; <!=> struct foo * a; struct foo * b;
----------------------------------------------------------------------------