通常我们对C/C++中宏的理解不外乎两点:
一, 用来处理头文件的重复包含。
二, 用来定义类似的函数的宏。
一, 用来处理头文件的重复包含。
二, 用来定义类似的函数的宏。
对于第一点,这个大家都能很好理解。第二点:用来定义类似的函数的宏也常常见到,比较经典的是:
define max(a,b) (a>b)?(a):(b)
类似于这样的作法主要是想绕过类型检查,这样无论a和b是什么类型之要能用">"运算符来比较的便可以使用宏来代替反复写max函数不同版本。但这样做明显有一个问题:我们缺少了类型保护,这对于大型应用程序来说是非常恐怖的一件事。(但也不尽然)。
C++中引入了范型(Generic Method)来解决这个问题。
C++中引入了范型(Generic Method)来解决这个问题。
但我今天想表达的全然不是上面这些,C/C++中的宏还有一个用处:
代码生成器(Code Generator)。
也许你对此不屑,坦白地讲先前我也是如此。这个很明显嘛,上学的时候我都知道了,比如上面的例子,当你写出如下的代码:
int iMax = max(5,6);
编译器会为你“自动”生成代码:
int iMax = (5>6)?(5):(6);
确实如此,编程三年以来,我确实也是这样的理解的。直到最近在看Graham Paul的《ANSI Common Lisp》,前言中有这样一句话:
Macros, for example: Lisp programmers can, and often do,
Macros, for example: Lisp programmers can, and often do,
write programs to write their programs for them.

本文探讨了C/C++中宏的用途,除了常见的头文件包含处理和定义类似函数外,还强调了宏作为代码生成器的角色。通过引用Graham Paul的《ANSI Common Lisp》,指出宏可以用于编写生成程序的程序,这一思想在MFC的源码中有所体现。文章鼓励读者深入研究MFC宏的使用和Lisp编程。
最低0.47元/天 解锁文章
623

被折叠的 条评论
为什么被折叠?



