简介
本书以例子的形式去描述各个模块,每一章节完整描述一两个接口的实现。
对这些例子的描述,以一种名为 文学程序 的形式给出
文学程序 旨在弱化描述程序内容时语法规则的束缚 ,从而以最适于理解的顺序展示出代码。
文学程序还可以有助于逐点对程序进行描述。什么意思呢?
其实就是在对书中代码元素打上标签,并且这个标签里还可以指示这个代码元素在书中哪一页,这样就方便阅读。
书中也给出了一个例子:
例子:一个double程序的实现
功能:检测输入中相邻的相同单词
定义根代码块来实现double 尖括号 后面带一个恒等于号(因为我输入法打不出来就写个“三”)
//下面根代码块的标签设置为程序的文件名 3表示double.c这个程序中的代码块所在的页码
//includes data prototypes functions分别是include部分 数据 函数原型 函数实现 四个元素
<double.c 3>三
<includes 4>
<data 4>
<prototypes 4>
<functions 3>
有了这一块定义,其他文学程序中要用到double.c代码块就可以直接提取整个程序
{
....
<double.c 3>三
....
}
他这里<function 3>代表的就是double.c中main函数代码块
<functions 3>三
int main(int argc, char *argv[]) {
int i;
for (i = 1; i < argc; i++) {
FILE *fp = fopen(argv[i], "r");
if (fp == NULL) {
fprintf(stderr, "%s: can't open '%s' (%s)\n",
argv[0], argv[i], strerror(errno));
return EXIT_FAILURE;
} else {
doubleword(argv[i], fp);
fclose(fp);
}
}
if (argc == 1) doubleword(NULL, stdin);
return EXIT_SUCCESS;
}
接下来是include部分
<includes 4>三
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
<functions 3>还可以包含其他函数代码块 可以追加上去
注意它在 <functions 3>+三
此处的+号 就是用于表示将下面的代码块追加到<functions 3>所表示的main函数末尾
<functions 3>+三
int getword(FILE *fp, char *buf, int size) {
int c;
c = getc(fp);
<scan forward to a nonspace character or EOF 6>
<copy the word into buf[0..size-1] 7>
if (c != EOF)
ungetc(c, fp);
return <found a word? 5>;
}
下面是prototypes部分 该部分和include部分一样 在文学程序中 可以放置在任意部分 但是尽量靠近实现处(对C语言语法规则的让步)
<prototypes 4>
int getword(FILE *, char *, int);
下面是data部分 代表数据/变量 可以看到这块还有个<scan forword to a nonspace character or EOF 5>三
这一段也被打了标签 只要是打了标签的就可以被抽取使用
<data 4>三
int linenum;
<scan forword to a nonspace character or EOF 5>三
for( ; c != EOF && isspace(c); c = getc(fp))
if ( c == '\n' )
linenum++;
文学程序的基本概念就是这样,总的来说就是让代码更容易阅读一点。
代码放在编辑器中,可以利用IDE的功能做函数跳转,变量跳转等。但是在书上就无法实现。
文学程序就使得这种情况下阅读代码更人性化。首先将不同性质的代码块分类,给予标签设置。同时给出标签所在的页码,读者可以更快的定位过去。