学习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标准定义的头文件:
<assert.h> | 验证程序断言 | |
<complex.h> | 支持复数算数运算 | c99 |
<ctype.h> | 字符类型 | |
<error.h> | 出错码 | |
<fenv.h> | 浮点环境 | c99新增 |
<float.h> | 浮点常量 | |
<inttypes.h> | 整形格式转换 | |
<iso646.h> | 替代关系操作符宏 | |
<limits.h> | 实现常量 | |
<locale.h> | 局部类别 | |
<math.h> | 数学常量 | |
<setjmp.h> | 非本地跳转 | |
<signal.h> | 信号 | |
<stdalign.h> | 对齐 | c11新增 |
<stdarg.h> | 可变参数表 | |
<stdatomic.h> | 原子支持 | c11新增 |
<stdbool.h> | 布尔类型和值 | |
<stddef.h> | 标准定义 | |
<stdint.h> | 整形 | |
<stdio.h> | 标准I/O库 | |
<stdlib.h> | 实用程序库函数 | |
<string.h> | 字符串操作 | |
<tgmath.h> | 通用类型数字宏 | |
<time.h> | 时间和日期 | |
<uchar.h> | 统一码工具 | c11新增 |
<wchar.h> | 扩展的多字节和宽字节 | |
<wctype.h> | 宽字节分类和映射支持 |
POSIX C库:
1、POSIX 标准定义的头文件:
POSIX标准定义的必须的头文件(26项) | |
<dirent.h> | 目录项 |
<fcntl.h> | 文件控制 |
<fnmatch.h> | 文件名匹配类型 |
<glob.h> | 路径名模式匹配类型 |
<grp.h> | 组文件 |
<netdb.h> | 网络数据库操作 |
<pwd.h> | 口令文件 |
<regex.h> | 正则表达式 |
<tar.h> | tar归档值 |
<termios.h> | 终端I/O |
<unistd.h> | 符号常量 |
<utime.h> | 文件时间 |
<wordexp.h> | 字扩展类型 |
<arpa/inet.h> | internet定义 |
<net/if..h> | 套接字本地接口 |
<netinet/in.h> | internet地址族 |
<netinet/tcp.h> | 传输控制协议定义 |
<sys/mman.h> | 内存管理声明 |
<sys/select.h> | select函数 |
<sys/socket.h> | 套接字接口 |
<sys/stat.h> | 文件状态 |
<sys/times.h> | 进程时间 |
<sys/types.h> | 基本系统数据类型 |
<sys/un.h> | unix域套接字定义 |
<sys/utsname.h> | 系统名 |
<sys/wait.h> | 进程控制 |
POSIX标准定义的XSI扩展头文件(26项) | |
<cpio.h> | cpio归档值 |
<dlfcn.h> | 动态链接 |
<fmtmsg.h> | 消息显示结构 |
<ftw.h> | 文件树漫游 |
<iconv.h> | 代码集转换实用程序 |
<langinfo.h> | 语言信息常量 |
<libgen.h> | 模式匹配函数定义 |
<monetary.h> | 货币类型 |
<ndbm.h> | 数据库操作 |
<nl_types.h> | 消息类别 |
<poll.h> | 轮询函数 |
<search.h> | 搜索表 |
<strings.h> | 字符串操作 |
<syslog.h> | 系统出错日志记录 |
<ucontext.h> | 用户上下文 |
<ulimit.h> | 用户限制 |
<utmpx.h> | 用户帐户数据库 |
<sys/ipc.h> | IPC |
<sys/msg.h> | 消息队列 |
<sys/resource.h> | 资源操作 |
<sys/sem.h> | 信号量 |
<sys/shm.h> | 共享存储 |
<sys/statvfs.h> | 文件系统信息 |
<sys/time.h> | 时间类型 |
<sys/timeb.h> | 附加的日期和时间定义 |
<sys/uio.h> | 矢量I/O操作 |
POSIX标准定义的可选头文件(8项) | |
<aio.h> | 异步I/O |
<mqueue.h> | 消息队列 |
<pthread.h> | 线程 |
<sched.h> | 执行调度 |
<semaphore.h> | 信号量 |
<spawn.h> | 实时spawn接口 |
<stropts.h> | XSI STREAMS接口 |
<trace.h> | 时间跟踪 |
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我们也是要好好的学习一下的。