MFC虽然没有未来,但是我觉得MFC的思想还是有必要研究研究的,在MFC中或者一些底层代码的编写中,宏是相当好用的,为什么呢?因为宏只是简单的替换,不进行类型转换,替换就意味着灵活,而C语言编程的灵魂就是灵活啊。
但是在高级语言中,甚至c++中,是提倡用常量的,不提倡用#定义,因为#定义有一定的副作用,玩不好就没命了。
这里我们讨论下# define的副作用。
# include & lt; stdio.h> # include & lt; stdlib.h> #定义CALL_WITH_MAX (a, b) f ((a)在(b) & # 63;(一):(b)) int主要(空白) { int=5; int b=0; CALL_WITH_MAX (+ + a, b); CALL_WITH_MAX (+ + a, b + 20); 返回0; } >之前分析:
上面的问题,不知道大家有没有看出来。
对于CALL_WITH_MAX (+ + a, b);1,首先加1,变成了6
2,再和b进行比较,结果是大,最后返回的结果是(+ +),又被加1,最后的结果是7
,对于CALL_WITH_MAX (+ + a, b + 20);
1,首先加1,变成了8
2,再和b进行比较,结果是大,最后返回的结果是b,此时的b为20,那么一只加了一次,一个的结果是8# include & lt; stdio.h> # include & lt; stdlib.h> #定义CALL_WITH_MAX (a, b) f ((a)在(b) & # 63;(a) (b)): 空白f (int x) { printf("比较结果=% d \ n”, x); } int主要(空白) { int=5; int b=0; printf(“初始值=% d \ n ", 1); CALL_WITH_MAX (+ + a, b); printf (" excute第一=% d \ n \ n ", 1); printf(“初始值=% d \ n ", 1); CALL_WITH_MAX (+ + a, b + 20); printf (" excute第二=% d \ n \ n ", 1); 返回0; }结果分析如下: