C语言深度剖析---预处理(define)(转载)

时间:2021-11-03 00:20:46

1.数值宏常量

    #define宏定义是个演技非常高超的替身演员,但也会耍大牌的,所以我们使用它要慎之又慎。它可以出现在代码的任何地方,从本行宏定义开始,以后的代码都认识宏了;也可以把任何东西都定义成宏。因为编译器会在预编译的时候用真身替换替身,所以在我们的代码里可以常常用替身来帮忙。
    #define  PI     3.1415926
   在此后的代码中,你尽可能的使用PI来代替3.1415926,而且最好就这么做。不然的话,如果我们精度再提高一点怎么办?如果用PI的话,我们就只需要修改一次。这种情况不是最要命的,我们看下面情况:
    #define ERROR_POWEROFF -1
 如果你的代码里不用ERROR_POWEROFF这宏而用-1,估计在函数返回错误代码的时候(往往开发一个系统需要定义很多错误代码)。恐怕上帝都不知道-1表示什么意思吧。这个-1,我们称为魔鬼数,上帝碰到它也会发狂的。所以,代码里一定不要出现魔鬼数。
    const修饰的数据是有类型的,而define宏定义的数据没有类型。为了安全,建议以后定义一些宏常量时用const代替,编译器会给const修饰的只读变量做类型校验,减少错误的可能。但要注意,const修饰的不是常量而是readonly 的变量,const修饰的只读变量不能用来作为定义数组的维数,也不能放在case后面。
 
2.字符串宏常量
   #define ENG_PATH     E:\English\listen_to_this\listen_to_this_3
 
3.用宏定义表达式
   #define   SQR  ((x)*(x))
   注意,最外层的括号不要省
 
4 #undef
   #undef是用来撤销宏定义的。
    #define  PI     3.1415926
   .......
    //code 
   #undef
 也就是说宏的生命周期是从#define开始到#undef结束的。