标准都是条条框框的,以严谨著称,语言晦涩难懂。这也是大多数人不愿意“接近”它的原因。但它吸引我的最重要原因恰恰是“标准”二字,我觉得我能从这个标准中找到一些“闪光点”,而这些“闪光点”又恰恰是能让我有所提高的地方。

1、翻译环境
C Source文件是以文本形式存在的,将之转变成可执行程序的过程,我们管之叫“翻译”。C语言的翻译不是一蹴而就的,一般需要两遍才能达到目的,第一遍称为“预处理”,预处理的基本单位是“预处理翻译单元”。第二遍叫“编译”,编译的基本单位是“翻译单元”

a)何为“预处理翻译单元”?
其实很多人之前对这个的理解都很模糊,标准中是如是说的“一个预处理翻译单元是由一个Source file和该Source file通过#include指示符包含的Header files和Source files组成的”,不妨多看几次这个说明,标准就是标准,理解起来还真有些费事^_^。注:#include "xx.c"是没有错误的,只是不常用。

b)“预处理翻译单元”和“翻译单元”之间的关系
预处理后的“预处理翻译单元”叫“翻译单元”。

c)“翻译单元”之间的关系
首先翻译单元相互独立编译;
其次一个完整的可执行程序是由众多翻译单元链接而成的;
最后翻译单元之间是“external linkage(外部链接)”的关系。

2、执行环境
经过复杂的翻译后,现在我们拥有了可以执行的程序了。我们要关心的就是我们的“执行环境”了。执行环境分为两类:“独立的”和“宿主的”。都很好理解。前者在实现时没占一点操作系统的便宜。后者则恰恰相反,利用了很多操作系统的特性和现成的东东。

我们所使用的执行环境多为后者。启动函数(Startup function)一般为main,main有两种原型形式:
int main(void);
int main(int argc, char *argv[]);
当然对第二个main的参数有些限制。如argc >= 0等。

3、其他考虑
a)字符集
源文件字符集:用于书写源文件的字符集。
执行字符集:在执行环境中被解释的字符集。
基础字符集:包括26个小写拉丁字母、26个大写拉丁字母、数字0~9等,这些字符的值都能用8位bit(即一个字节)编码表示。我的理解如ASCII字符集
扩展字符集:一些非基础字符集的区域相关(locale-specific)的字符。我的理解如Unicode字符集
null字符:一个所有位都为0的byte被称为null字符,用于标识字符串结尾。

4、环境限制
没有绝对的自由,无论是“翻译环境”还是“执行环境”都有一定的限制。
这里不想列举那么多的数字。
那我们该怎么得到这些限制呢?这里有几个头文件:
:int相关长度限制
:浮点数相关限制
:额外的一些关于int的限制。