《C专家编程》一1.8 ANSI C标准的结构
本节书摘来自异步社区《C专家编程》一书中的第1章,第1.8节,作者 【美】Perter Van Der Linde,更多章节内容可以访问云栖社区“异步社区”公众号查看
如果我们岔开话题,快速浏览一下ANSI C标准的出处和内容,对读者应该是有帮助的。ANSI C标准分成四个主要的部分:
第4节:介绍(共5页)。对术语进行介绍和定义。
第5节:环境(共13页)。描述了围绕和支持C语言的系统,包括在程序启动时发生什么,程序中止时发生什么,以及一些信号和浮点数运算。编译器的最低限制和字符集信息也在这一部分介绍。
第6节:C语言(共78页)。标准的这部分是基于Dennis Ritchie数次出版的经典之作“The C Reference Manual”,包括The C Programming Language的附录A。如果对比标准和附录,就会发现大多数标题都是一样的,顺序也相同。标准中的主题用辞生硬,看上去像表1-1那样(空白的子段落被省略)。
![daebb2c3485ce7d44fa57d6a2ea31aa2b07be3a6](https://yqfile.alicdn.com/daebb2c3485ce7d44fa57d6a2ea31aa2b07be3a6.png)
最初的附录只有40页,但在ANSI C标准中,足足多了一倍。
第7节:C运行库(共81页)。本节提供了一个遵循标准的编译器必须提供的库函数列表,它们是标准所规定的辅助和实用函数,用于提供基本的或有用的功能。ANSI C标准第7节所描述的C运行库是基于/user/group 1984 年的标准,去除了一些UNIX特有的部分。“/user/group”是一个于1984年成立的UNIX国际用户小组。1989年,它更名为“UniForum”,它现在是一个非盈利性行业协会,其宗旨是完善UNIX操作系统。
UniForum从行为的角度对UNIX进行了成功的定义,这激励了许多有创造性的想法,包括X/Open的可移植性指导方针(第4版,XPG/4出现于1992年12月)、IEEE的POSIX 1003、System Ⅴ Interface Definition(系统5接口定义)以及ANSI C标准函数库。每个人都与ANSI C工作小组协作,确保他们所有的标准草案相互之间保持一致。感谢上帝!
ANSI C标准同时附有一些很有用的附录:
附录F:一般警告信息。在许多常见的情况下,诊断信息并非标准所强制要求,但如果有这方面的信息,肯定对程序员有帮助作用。
附录G:可移植性话题。有一些关于可移植性的一般性建议,把遍布标准各处的所有这方面的建议集中在一个地方。它包括未确定的、未定义的和由编译器定义的行为等方面的信息。
![8eeeb50d6a7d613eb184bc83347a996c5f88f14b](https://yqfile.alicdn.com/8eeeb50d6a7d613eb184bc83347a996c5f88f14b.png)
标准设立后轻易不作变动,即使是修改错误
并不能因为标准是由国际标准组织所撰写的就认定它必然完整、一致乃至正确。IEEE POSIX 1003.1-1998标准(它是一个操作系统标准,定义类似UNIX的行为)就存在一个非常有趣的自相矛盾的地方:
“[一个路径名]...最多由PATH_MAX个字节所组成,包括最后面的‘0’字符” ——摘自第2.3节。
“PATH_MAX是一个路径名中最多能出现的字节个数(并不是字符串的长度;不包括最后面的‘0’字符”——摘自第2.9.5节)。
所以,PATH-MAX个字节既包括最后面的‘0’,又不包括最后面的‘0’!
看来需要加以解释。答案(IEEE Std 1003.1-1988/INT,1992版,解释编号:15,第36页)认为标准出现了不一致,不过两个结果可以认为都是正确的(这令人很感奇怪,因为一般的观点认为它们不可能两个都是正确的)。
之所以出现这个问题,是由于在修改草案时,所有出现这个词的地方并未得到全部更新。标准化过程非常重视形式,显得僵化。如要更新,只有投票小组批准后才允许对问题进行修改。
这样的错误也曾出现在C标准最早期的脚注里,也就是所附的Rationale文档。事实上,Rationale现在已不属于C标准的一部分,当标准的所有权移交到ISO时,它就被删掉了。
![a6efbade23b6358ae1490640c6e0610926e75f58](https://yqfile.alicdn.com/a6efbade23b6358ae1490640c6e0610926e75f58.png)
K R C和ANSI C之间的区别
阅读本节内容时,我假定你已经完全明白K R C,对ANSI C也已知道了90%。ANSI C和K R C的区别分成四大类,按其重要性分列于下:
1. 第一类区别是指一些新的、非常不同的、并且很重要的东西。惟一属于这类区别的特性是原型——把形参的类型作为函数声明的一部分。原型使得编译器很容易根据函数的定义检查函数的用法。
2.第二类区别是一些新的关键字。ANSIC正式增加了一些关键字:enum代表枚举类型(最初出现于pcc的后期版本),const、volatile、signed、void也有各自相关的语义。另外,原先可能由于疏忽而加入到C中的关键字entry则弃之不用。
3.第三类区别被称作“安静的改变”——原先的有些语言特性仍然合法,但它的意思有了一些轻微的改变。这方面的例子很多,但都不是很重要,几乎可以被忽略。在你偶尔漫步于它们之上时,可能由于不注意而被其中一个绊了个趔趄。例如,现在的预处理规则定义得更加严格,有一条新规则,就是相邻的字符串字面值会被自动连接在一起。
4.最后一类区别就是除上面3类之外的所有区别,包括那些在语言的标准化过程中长期争论的东西,这些区别在现实中几乎不可能碰到,如符号粘贴(token-pasting)和三字母词(trigraph)(三字母词就是用3个字符表示一个单独的字符,如果该字符不存在于某种计算机的字符集中,就可以用这3个字符来表示。比如两字母词(digraph)t表示“tab”,而三字母词?? 则表示“开放的花括号”)。
ANSI C中最重要的新特性就是“原型”,这种特性取自C++。原型是函数声明的扩展,这样不仅函数名和返回类型已知,所有的形参类型也是已知的。这就允许编译器在参数的使用和声明之间检查一致性。把“原型”称作是“带有所有参数的函数名”是不够充分的,它应该被称作“函数签名(function signiture)”,或者像Ada那样称作“函数说明(function specification)”。
![dd26f59d00bbd06615d30a7f10b968ded4358534](https://yqfile.alicdn.com/dd26f59d00bbd06615d30a7f10b968ded4358534.png)
原型的形成
原型的目的是当我们对函数作前向声明(forward declaration)时,在形参类型中增加一些信息(而不仅仅是函数名和返回类型)。这样,编译器就能够在编译时对函数调用中的实参和函数声明中的形参之间进行一致性检查。在K R C中,这种检查被推迟到链接时,或者干脆不作检查。使用原型以后,原先的:
char * strcpy();
现在在头文件中的形式如下:
char * strcpy(char *dst, const char *src);
可以省略参数名称,只保留参数类型:
char * strcpy(char *, const char *);
但最好不要省略形参名。尽管编译器并不理睬形参的名称,但它们经常能向程序员们传递一些有用的信息。类似地,函数的定义也从:
char * strcpy(dst, src) char *dst, *src; { ... }
变成了:
char * strcpy(char *dst, const char *src) /* 注意没有分号 */ { ... }
函数头不再以一个分号结尾,而是在后面紧接一个组成函数体的复合语句。
每次编写新函数时都应该使用原型,并确保它在每次调用时都可见。不要回到K R C老式的函数声明方法,除非需要使用缺省的类型升级(这个话题在第8章详细讨论)。
把同一种东西用几个不同的术语来称呼,确实有点神秘。就好像药品至少有3种名称一样:化学名、商品名和常用名。
你的团队有完成定义标准吗? 大家好,我是阿萨。现在基本上做软件行业的,大家都在搞敏捷开发。如果没有搞敏捷开发,感觉都不好意思给别人说自己是软件开发。那么敏捷里的最佳实践------完成定义标准你们团队有吗?
关于区块链标准、定义,IEEE的最新研讨讲了这几点 委员会委员、受邀的数十位业界顶级专家和多名IEEE高管就基于区块链的资产交易的应用场景、专利分布、支撑技术、政策监管等方面进行了详细而深入的探讨。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- 第三百八十三节,Django+Xadmin打造上线标准的在线教育平台—第三方模块django-simple-captcha验证码
- 让开源和标准成为云原生的确定性力量
- UNIX环境高级编程笔记之标准I/O库
- C++11时代的标准库快餐教程(2) - STL概览
- 什么是 Dynatrace 的 Speed Index 度量标准
- Atitit office Ooxml excel标准的主要内容 目录 1.1. 物理存储 zip+文件夹包+xml1 1.2. Package Structure1 1.3. 内容部分1
- Atitit webservice发现机制 WS-Discovery标准的规范attilax总结
- Atitit.常见软件 数据 交换格式 标准
- SAP CRM Fiori 标准应用 My Account - search by ID 根据 ID 进行搜索的标准功能实现原理
- 标准物模型:设备无缝对接,IOT界的福音
- CWE4.6标准中加入 OWASP 2021 TOP10
- Java 标准编码 StandardCharsets
- 【CSS】浮动 ③ ( 浮动特性 | 脱离标准流布局 | 取消占用位置 | 显示模式类似于行内块元素 )
- 【Android 逆向】ptrace 函数 ( C 标准库 ptrace 函数简介 | ptrace 函数真实作用 )
- Java练习 标准输入,输出,以及switch判断
- IEEE754标准中的4种舍入模式
- Python标准库:内置函数staticmethod(function)
- 标准IO函数---扩展练习知识点2
- 24. SAP 标准产品里使用 OData 服务的一些细节分享
- C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)
- Go fmt包中 Scan获取标准输入