使用 C 语言的“准元程序”设计

将 C 语言的预编译语言看成是“元语言”,使用该元语言进行程序设计

但为什么叫“准元程序”?

因为 C 语言的预编译语言没有迭代结构,所以C 语言的元程序语言不是图灵完备的。举个简单的例子,我们无法用 C 语言的“元语言”写出一个计算 factorial(x)——x 的阶乘的程序;而用 C++的模板就可以(使用模板特化)。因为这需要语言的迭代结构。C预编译语言没有迭代结构的原因是宏替换仅发生在源语言的宏调用中,预编译中的宏调用是不会发生替换的(除了条件编译中条件中对宏的调用)如:

但是,在条件编译中:

因此,象这样的程序是错误的:

适应它,Play With Preprocessor

虽然如此,用 C 语言的预编译能力,在很多时候还是可以写出很好的程序,可以尽可能地减少代码冗余,增强程序性能。程序的可读性,也许增加了,也许减少了;但是在这个探索的过程中,很可能对问题的认识更深刻了,问题得到了更高程度的抽象。

元程序使用的几个重要重要指令:

CAT_TOKEN是一个核心的基本构造块。

总体上讲,C++的元程序设计是函数式语言(类似 lisp),而C语言的元程序设计有点类似汇编语言,试看:

 

实例,实现函数

      a)  这是一个性能要求相当高基本图像位传送函数,同时又有许多种位操作:
          (1)  not,and,or,xor,…完备的布尔代数,共16种布尔操作,去掉全真和全假,是14种操作
          (2)  许多种象素位数(1,2,4,8,16,24,32),甚至更多。
          (3)  这些情况组合起来,共有 686种(7×7×14)这显然是一个“过于完备”)的集合。
          (4)  如果按普通的方式编码,要写 686多个不同的函数,或者 switch…case中686种不同的 case。而这些代码都是非常相似的,如果把相同部分提取出来,把不同部分使用“模板”替换掉…..

          (5)  详细内容见代码,代码是非常短的(同时还有另外一个函数mergeblt,原型与bitblt相同,其中仅实现了16,24,32位象素),这些代码如果使用预编译器输出处理结果,有 6000 多行!: 

代码(附件中有完整代码)

作者:
该日志由 rockeet 于2005年11月03日发表在C++分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
转载请注明: 使用 C 语言的“准元程序”设计
标签:
【上一篇】
【下一篇】

您可能感兴趣的文章:

2 个回复

  1. soloist说道:

    呵呵,你倒是让预处理器挑起了代码产生器的重担。
    <br>
    <br> 元编程技术很有趣,从早期的Lisp/Scheme可编程宏到C++的Template,再到REBOL语言的Dialect概念都通过不同方式为语言提供了这么一种能力。
    <br>
    <br> 本人也对这方面颇有兴趣,目前正在开发一个支持静态元编程的开放式Lua语言编译器: http://www.luachina.org/projects/openlua/
    <br>
    <br> 希望能与你深入交流。

  2. whinah说道:

    有人发信抱怨排版太乱,重新排过

发表评论

您必须 登录 后才能发表评论。