发现用混合C的C++很难写出完全正确的程序

阅读更多关于《发现用混合C的C++很难写出完全正确的程序》

febird.dataio vs boost.serialization 运行性能对比

阅读更多关于《febird.dataio vs boost.serialization 运行性能对比》

代码表示的是数据格式,DATA_IO_LOAD_SAVE 在 <febird/io/DataIO.h> 中定义

对于 boost.serializationDATA_IO_LOAD_SAVE 的定义相当于: 继续阅读

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

阅读更多关于《使用 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 多行!: 

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