写一个不能编译的程序毫无挑战性。大概最容易的方法,就是交给C++编译器某种甚至根本
不是C++程序的东西,比如任意的一堆文章。
然而,虽然根本不能编译的程序不是很有用,有时候它们还是很有趣的。例如,如果我把
我自己计算机上的C++编译器拿来,让它编译一个名为a.c的文件,里面只包含foo,那么输
出是::
CC a.c:
“a.c”, line 1: error: bad declaration of foo-did you
forget a ‘;’?
1 error
假设我们现在把这个有用的错误信息拿来当成一个程序如何?那看起来像一个好办法,可
以让编译器对我们说一些有趣的话。而结果,最终是::
CC a.c:
“a.c”, line 1: error: CC a : CC is not a type name
“a.c”, line 1: error: ‘.’ used for qualification;
please use ‘::’
“a.c”, line 1: error: body of non function c
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: bad declaration of line-did you
forget a ‘;’
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: body of non function error
“a.c”, line 2: error: bad declaration: bad is not a type name
“a.c”, line 2: error: declaration of :
declaration is not a type name
“a.c”, line 2: error: of foo : of is not a type name
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: did you : did is not a type name
Sorry, too many errors
14 errors
倒数第二行很有趣:这个特定编译器在某个程序中遇上多于某个数目的错误以后就扔毛巾
(认输)了。
这种行为在很多场合证明是有用的。通常当一个程序产生如此多的编译错误,其中至少有
一部分是由编译器试图猜测如何纠正前面的错误引起的。
通常最好先修正编译器发现前两个错误,然后再试一遍,然后再试图一次修正它们。假设
我们把上面的诊断输出信息拿来再编译一次如何?那样我们就得到::
CC a.c:
“a.c”, line 1: error: CC a : CC is not a type name
“a.c”, line 1: error: ‘.’ used for qualification;
please use ‘::’
“a.c”, line 1: error: body of non function c
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: bad declaration of line-did you
forget a ‘;’
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: body of non function error
“a.c”, line 2: error: CC a : CC is not a type name
“a.c”, line 2: error: syntax error
“a.c”, line 2: error: CC is : CC is not a type name
“a.c”, line 2: error: is not : is is not a type name
“a.c”, line 2: error: not a : not is not a type name
Sorry, too many errors
14 errors
这已经非常类似前次尝试的输出了,虽然不可否认它还不完全一样。然而,如果我们重复
这个过程,编译器的输出真的完全与其输入一样。
我们刚刚得到了一个不寻常的自生成程序: 一个导致编译器生成的诊断信息与其本身一样
的程序。我们实际上把一个没用的程序转换成了一个有用的,只需改变我们对这个程序要
干什么的期望。换言之,我们写了一个甚至无需运行的自生成C++程序。
我只列出一本中文书,是因为这方面的中文书我看得少,英文书看得多。「恐有遗珠之憾」这类「八方得体」的话,还是说一下好了 。
注意,这些都只是强本固元用来扎基础的书籍而已,要观摩大型程式经验,还有诸如 Large Scale C++ Software Design(John Lakos/A.W./1996)可以阅读。
1. C++ Primer (3/e), Lippman/A.W./1998
(听说 1999 将有中译本)
这个估计是指繁体中文版,简体中文版2002年才出版
2. The C++ Programming Language (3/e), Bjarne/A.W./1997
这本我似乎至今没有见到简体中文版