存档

2011年7月 的存档

c reference manual读书笔记(三)

2011年7月30日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: c reference manual读书笔记(三)

这次主要是针对c语言中的声明(declaration)定义.

1 在c语言中声明的作用域(scope)可以分为4种,分别是 block/local scope, prototype scope, function scope以及file scope.其中file scope是最顶层的域. 如果一个声明不是external的,则默认这个声明就是被限制在它所出现的文件中.

2 一个标示符在它被完全声明之前是不能使用的。更精确的说就是从我们定义一个声明到这个声明的结束之间不能出现这个标示符.可是下面的例子是完全正确的,这是因为使用intsize(sizeof)之前,它已经被声明了:

static int intsize = sizeof(intsize)

而下面的例子则会编译出错,因为Test在使用之前还没有被声明.

typedef struct {Test *s} Test;

3 c语言中也支持forward reference,不过只允许下面三种类型,分别是 在goto语句中的label,label都是在goto语句之后声明的;还有就是允许在struct,union,array类型的完全声明之前使用当前的声明,比如下面的例子

typedef struct s {struct s *n} T;

最后一种例外是函数的声明,这个原因是在c99之前,c语言允许隐式(implicitly)的声明,也就是如果一个函数在调用之前没有被声明,则在函数被调用的地方会隐式的声明这个函数(后面会详细介绍这个)。不过c99是不允许隐式的声明的.
阅读全文…

Share

c reference manual读书笔记(二)

2011年7月16日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: c reference manual读书笔记(二)

这次主要是预处理器和宏处理的部分。

1 预处理器主要是处理源代码中以#开头的行,预处理器执行完毕后的代码必定是一个合法的c程序.

2 预处理器的命令是完全不依赖于c语言的语法的.

3 预处理器不会parse源代码,预处理的词法处理和编译器的是不同的,预处理器能够理解合法的c标记,可是它也会忽略在c编译器中认为是不合法标记。比如下面的代码,对于预处理器来说,没有任何问题的.

int3 i;

4 standard c允许#后面有空格,但是一些老的c编译器是不允许的。如果#后面没有任何字符(除了空格),那么standard c则认为这是一个空行,一些老的编译器有可能有不同的行为.
阅读全文…

Share

c reference manual读书笔记(一)

2011年7月3日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: c reference manual读书笔记(一)

我读的是第五版的影印版,简单的做了一些笔记.下面是第二章的笔记.

1 c 源文件的字符集(character set)包含在ISO/IEC 10646的Latin block中. 包括5种类型,分别是 52个lating大小写字母,10个数字(0-9),空格,horizontal tab(ht) vertical tab(VT) form feed(FF) 以及29个graphic 字符(这个可以去看c99的手册).而不在集合内的字符可能会出现在注释/字符常量/字符串常量/文件名中.在c中还有执行字符集(execution character)的概念,一般来说编译和运行都在相同的电脑,则source字符集和执行字符集都是相同的.

2 在c的源程序中,blank, end-of-line, vertical tab, form feed, horizontal-tab都会被认为是空格(whitespace characters).

3 c89中要求逻辑行的最大长度是509个字符,而c99是4095个字符.

4 c语言中可以使用 9个trigraphs(比如??/表示\),而trigraphs的翻译会在词法分析之前(gcc默认编译没有打开trigraph,必须添加-trigraphs命令,或者使用-std命令指定c标准).

5 多字节字符(multibytes characters),主要针对非英语的环境.编码实现分为state-independent和state-depend,顾名思义,一个是编码依赖于前一个多字节字符,一个是不依赖于前一个多字节字符.
阅读全文…

Share