1、#define 宏定义
可以看成替身演员 用时要小心,不要叫他耍大牌!
#defien PI 3.1415926
#define ERROR_POWEROFF -1
知道返回值是一个魔鬼数字,一定要这样使用。
2、字符串宏常量
#define ENG_PATH_1 E:\English\listing
#define ENG_PATH_2 "E:\English\listing"
如果路径太长使用反斜杠接续符:
#define ENG_PATH_2 E:\English\lis\
ting
但是有的使用系统规定路径使用“\\” 比如VS2013
3、define定义符号
4、define定义表达式
#define SEC_A_YEAR 60*60*24*365
这个数太大容易溢出
一般写为:
#define SEC_A_YEAR (60*60*24*365)UL
#define SEC_A_YEAR (60LL * 60 LL * 24LL * 365LL)
#define SQR(x) x*x
如果 x =10 代入 SQR(10) = 10*10 = 100 正确
如果x = 10+1 代入 10+1 * 10 +1 = 21 与我们设想的不太一样
#define SQR(x) ((x) * (x)) //这个代码有问题吗?请思考
例如
#deifine SUM(x) (x) + (x)
例如:SUM(x) * SUM(x) 如果 x = 5*3 (5*3 )+ (5*3) * (5*3) + (5*3)
又错了
所以对待#define 不要吝啬括号就好了!
#define sub(a,b) ((a)+(b))
#define MAX(a,b) ((a)>(b) ? ( a):(b))
#define MAX(a,b) \
({int A = a, B = b; ((A)>(B)? (A):(B);)}) // 可以使用函数。
#defienMAX(a,b) \
({typeof(a) A = a, B = b; ((A)>(B)? (A):(B);)})
尽量使用普通函数,而不要使用“宏定义函数”。可以减少代码空间的占用(ROM空间)。
#if defined 和#if !defined 的用法
#define ....
#define ....
....
....
#define a 100
....
此时,我们要检查a是否定义(假设我们已经记不着这点了),或者我们要给a一个不同的值,就加入如下句子
#if defined a
#undef a
#define a 200
#endif
上述语句检验a是否被定义,如果被定义,则用#undef语句解除定义,并重新定义a为200
同样,检验a是否定义:
#ifndef a //如果a没有被定义
#define a 100
#endif
以上所用的宏中:#undef为解除定义,#ifndef是if not defined的缩写,即如果没有定义。
这就是#if defined 的唯一作用!
#if defined XXX_XXX
#endif
是条件编译,是根据你是否定义了XXX_XXX这个宏,而使用不同的代码。
一般.h文件里最外层的
#if !defined XXX_XXX
#define XXX_XXX
#endif
是为了防止这个.h头文件被重复include。
2)
#error XXXX
是用来产生编译时错误信息XXXX的,一般用在预处理过程中;
例子:
#if !defined(__cplusplus)
#error C++ compiler required.
#endif