学习c语言过程中必不可少要了解c语言的标准及其发展历史,在介绍它们之间的关系之前,首先介绍以下几个组织:
ANSI:美国国国家标准学会(AMERICAN NATIONAL STANDARDS INSTITUTE)成立于1918年。是一个专门制定标准化的机构,主要制订统一的通用标准。
ISO:是国际标准化组织(International Organization for Standardization,ISO)简称ISO。是一个全球性的非政府组织,是国际标准化领域中一个十分重要的组织。
GNU:它是GNU's Not Unix的缩写,实际上GNU就是一个自由软件操作系统,GNU操作系统包括GNU软件包(专门由GNU工程发布的程序)和由第三方发布的自由软件。GNU 是由自由软件基金会 (Free SoftwareFoundation,FSF) 于1984年发起的,称为GNU工程。
GNU/Linux:GNU是一个类Unix操作系统。它是各种软件包的集合,包括:应用程序、系统库、开发工具以及游戏等等。GNU的许多程序在GNU工程下发布;我们称之为GNU软件包。类Unix操作系统中用于资源分配和硬件管理的程序称为“内核”。GNU 的内核尚未完成,所以 GNU所用的典型内核是Linux,该组合叫做GNU/Linux操作系统。
GNU软件包列表:该系统的基本组成包括GNU编译器套装(GCC)、GNU的C库(glibc)、以及GNU核心工具组(coreutils)、(GDB)。截至2015年11月,全国共有466 GNU软件包(包括退役,但不包括383 )主办的官方GNU开发的网站。
ANSI C标准与ISO C标准之间的关系。
下面用几句话介绍几种C语言标准之间的关系:
- 早期的计算机汇编语言是与机器平台紧密耦合的,为了屏蔽这种耦合,增加代码的可移植性,C语言随机出现。
- ANSI C:二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准学会(ANSI)为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
- IOS C:与ANSI C标准同时出现的就是ISO组织,将ANSI C加入了ISO的大家庭,定义了ISO C。除了在格式和排版等方面存在一些差别外,其他都与ANSI C相同。
- 所以一句话ANSI C与ISO C 对于我们开发者来说完全相同。
-
目前出现的C标准如下:
- C89:1989年,ANSI发布了第一个完整的C语言标准——ANSI X3.159—1989,简称“C89”
- C99:C99标准是 ISO/IEC 9899:1999 - Programming languages -- C 的简称,是C语言的官方标准第二版
- C11:C11标准是 ISO/IEC 9899:2011 - Information technology -- Programming languages -- C 的简称,C语言标准的第三版
- 对于编程来说,不同的机器平台的编译器可能不同,但是他必须按照ISO C的标准来实现,即他必须支持对于C标准的语法规则的编译。当然随着C标准的演进,编译器也是需要随之演进的,比如当前的C11标准,不是所有的编译器均支持。
- 交叉编译,就是在一个平台上通过交叉编译器,编译另个平台上运行的程序。编译器起到重要作用!
其他标准: ( POSIX, SVID, XPG, ...)
POSIX 标准:实际上并没有 POSIX C标准,但是有POSIX C库。POSIX是:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )。POSIX标准定义了操作系统应该为应用程序提供的接口标准。
SVID:System V 的接口描述。System V 接口描述(SVID)是描述 AT&&;T Unix System V 操作 系统的文档,是对 POSIX 标准的扩展超集。
XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版), 是比 POSIX 更为一般的标准。X/Open 拥有 Unix 的版权,而 XPG 则指定成为 Unix 操作系统必须满足的要求。
GNU C:GNU C 实际上指的是GNU C库(GNU C Library,又称为glibc),即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。关于GNU C library的具体介绍参见http://www.gnu.org/software/libc/manual/html_mono/libc.html#Introduction
几种标准库:c标准库,POSIX标准库,GNU C库。
c标准库:
1、C标准库是严格按照C标准规范实现的一个C库,在Linux下有个叫libc的库就是标准库了。有些Linux下可能已经和glibc打包到一起了。
2、起初的C标准库存在15个头文件,目前已经扩展到28项,展示一下ISO C标准定义的头文件:
| 验证程序断言 | |
| 支持复数算数运算 | c99 |
| 字符类型 | |
| 出错码 | |
| 浮点环境 | c99新增 |
| 浮点常量 | |
| 整形格式转换 | |
| 替代关系操作符宏 | |
| 实现常量 | |
| 局部类别 | |
| 数学常量 | |
| 非本地跳转 | |
| 信号 | |
| 对齐 | c11新增 |
| 可变参数表 | |
| 原子支持 | c11新增 |
| 布尔类型和值 | |
| 标准定义 | |
| 整形 | |
| 标准I/O库 | |
| 实用程序库函数 | |
| 字符串操作 | |
| 通用类型数字宏 | |
| 时间和日期 | |
| 统一码工具 | c11新增 |
| 扩展的多字节和宽字节 | |
| 宽字节分类和映射支持 | |
POSIX C库:
1、POSIX 标准定义的头文件:
| POSIX标准定义的必须的头文件(26项) | |
| 目录项 |
| 文件控制 |
| 文件名匹配类型 |
| | 路径名模式匹配类型 |
| 组文件 |
| 网络数据库操作 |
| 口令文件 |
| | 正则表达式 |
| tar归档值 |
| 终端I/O |
| 符号常量 |
| 文件时间 |
| 字扩展类型 |
| internet定义 |
| | 套接字本地接口 |
| internet地址族 |
| 传输控制协议定义 |
| 内存管理声明 |
| select函数 |
| 套接字接口 |
| | 文件状态 |
| 进程时间 |
| 基本系统数据类型 |
| | unix域套接字定义 |
| 系统名 |
| 进程控制 |
| POSIX标准定义的XSI扩展头文件(26项) | |
| | cpio归档值 |
| 动态链接 |
| 消息显示结构 |
| | 文件树漫游 |
| 代码集转换实用程序 |
| | 语言信息常量 |
| 模式匹配函数定义 |
| 货币类型 |
| | 数据库操作 |
| 消息类别 |
| | 轮询函数 |
| | 搜索表 |
| 字符串操作 |
| | 系统出错日志记录 |
| 用户上下文 |
| 用户限制 |
| 用户帐户数据库 |
| IPC |
| 消息队列 |
| 资源操作 |
| 信号量 |
| 共享存储 |
| 文件系统信息 |
| 时间类型 |
| 附加的日期和时间定义 |
| | 矢量I/O操作 |
| POSIX标准定义的可选头文件(8项) | |
| 异步I/O |
| 消息队列 |
| 线程 |
| | 执行调度 |
| 信号量 |
| | 实时spawn接口 |
| XSI STREAMS接口 |
| | 时间跟踪 |
Glibc库:
C 语言并没有为常见的操作,例如输入/输出、内存管理,字符串操作等提供内置的支持。 相反,这些功能一般由标准的“函数库”来提供。GNU 的 C 函数库,即 glibc,是 Linux 上最重要的 函数库,它定义了 ISO C 标准指定的所有的库函数,以及由 POSIX 或其他 UNIX 操作系统变种指定的附加特色,还包括有与 GNU 系统相关的扩展。。glibc 基于如下标准:
-
ISO C: C 编程语言的国际标准。
-
POSIX:GNU C 函数库实现了 ISO/IEC 9945-1:1996 (POSIX 系统应用程序编程接口, 即 POSIX.1)指定的所有函数。该标准是对 ISO C 的扩展,包括文件系统接口原语、设备相关的终端控制函数以及进程控制函数。同时,GUN C 函数库还支持部分由 ISO/IEC 9945-2:1993(POSIX Shell 和 工具标准,即 POSIX.2)指定的函数, 其中包括用于处理正则表达式和模式匹配的函数。
-
Berkeley Unix:BSD 和 SunOS。GNU C 函数库定义了某些 UNIX 版本中尚未标准化的函数, 尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系统(即“Berkeley Unix”)以及“SunOS” (流行的 4.2 BSD 变种,其中包含有某些 Unix System V 的功能)。BSD 函数包括 符号链接、select 函数、BSD 信号处理函数以及套接字等等。
-
SVID:System V 的接口描述。GNU C 函数库定义了大多数由 SVID 指定而未被 ISO C 和 POSIX 标准指定的函数。来自 System V 的支持函数包括进程间通信和共享内存、 hsearch 和 drand48 函数族、fmtmsg 以及一些数学函数。
-
XPG:X/Open 可移植性指南。GNU C 函数库遵循 X/Open 可移植性指南(Issue 4.2) 以及所有的 XSI(X/Open 系统接口)兼容系统的扩展,同时也遵循所有的 X/Open Unix 扩展。
C语言学习总结
- 想要使用C语言开发软件系统,必须了解C标准包括语法规则,其次就是在学习C标准库。清楚哪些基础库可以使用。
- 对于C标准库应该各个操作系统平台都支持,放心使用即可。
- 在Linux操作系统上编程,当然要学习POSIX标准,了解POSIX提供了哪些编程接口,方便快速开发。
- GNU C中存在一些对于C标准的优化,如果是在Linux上开发程序,那我们应该大胆的使用它,方便我们程序的开发。例如关于__attribute__的机制就是GNU C的一大特色。所以关于GNU C我们也是要好好的学习一下的。