|
define专题(转贴)(1)
原文:CSdn.net/EXPert/topic/3194/3194845.XML?temp=.2763483">http://community.csdn.net/Expert/topic/3194/3194845.xml?temp=.2763483 缘起,为什么要使用define 我们在写程序的时候总是需要一些如下的代码 int* p =(int *)malloc(sizeof(int)*100) for(i=0;i<100;i++) { ................ } 好,这个代码能正常的运行,但是有一天,突然觉得100实在是有点少,我打算申请1000个int,改成如下的代码 int* p =(int *)malloc(sizeof(int)*1000) for(i=0;i<1000;i++) { ................ } 为了让这个代码正常的工作,修改了两次,如果在更多的地方使用了数组的最大值, 那么我可能需要对每一个地方都进行修改,无法想象的恐怖啊,而且,就算是我能修改1000,过了一年之后我都未必知道这个1000对程序意味着什么。对于每一个程序员都会想象,如果有一个类似于ArrayMax之类的东西来代替1000有多好。既增加了程序的可读性,又使得程序易于修改。 写程序的时候,总是需要一些小的函数,例如一个返回两个数中较大值的函数,而众所周知,函数调用会带来比较大的系统开销,但是我们又不能总是去写 int d = x>y ? x:y; 这种语句,一个是些大量重复的代码,另一个是程序很难维护,如果有这样一种模式,他看起来像一个函数,却不会带来函数那样的系统开销,就会使这种情况大大的改观。 让我们先来看看define的基本语法,如下: 1.简单的define定义 #define 1000 MAX 一个简单的max就定义好了,它代表1000,如果在程序里面写 for(i=0;i{ ................ } 编译器在处理这个代码之前会对MAX进行处理替换为1000。 2.define的“函数定义” define可以像函数那样接受一些参数,如下 #define max(x,y) (x)>(y)?(x):(y); 这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。 3.宏的单行定义 #define A(x) T_##x #define Bx) #@x #define Cx) #x 我们假设:x=1,则有: A(1)------〉T_1 B(1)------〉'1' C(1)------〉"1"
|