c标准与c标准库

学习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语言标准之间的关系:

  1. 早期的计算机汇编语言是与机器平台紧密耦合的,为了屏蔽这种耦合,增加代码的可移植性,C语言随机出现。
  2. ANSI C:二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准学会(ANSI)为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
  3. IOS C:与ANSI C标准同时出现的就是ISO组织,将ANSI C加入了ISO的大家庭,定义了ISO C。除了在格式和排版等方面存在一些差别外,其他都与ANSI C相同。
  4. 所以一句话ANSI C与ISO C 对于我们开发者来说完全相同。
  5. 目前出现的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语言标准的第三版
  6. 对于编程来说,不同的机器平台的编译器可能不同,但是他必须按照ISO C的标准来实现,即他必须支持对于C标准的语法规则的编译。当然随着C标准的演进,编译器也是需要随之演进的,比如当前的C11标准,不是所有的编译器均支持。
  7. 交叉编译,就是在一个平台上通过交叉编译器,编译另个平台上运行的程序。编译器起到重要作用!

其他标准: ( 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语言学习总结

  1. 想要使用C语言开发软件系统,必须了解C标准包括语法规则,其次就是在学习C标准库。清楚哪些基础库可以使用。
  2. 对于C标准库应该各个操作系统平台都支持,放心使用即可。
  3. 在Linux操作系统上编程,当然要学习POSIX标准,了解POSIX提供了哪些编程接口,方便快速开发。
  4. GNU C中存在一些对于C标准的优化,如果是在Linux上开发程序,那我们应该大胆的使用它,方便我们程序的开发。例如关于__attribute__的机制就是GNU C的一大特色。所以关于GNU C我们也是要好好的学习一下的。

你可能感兴趣的:(C语言学习资料库)