C语言的预处理

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  的用法


因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.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 的唯一作用!
1) 
#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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值