c标准与c标准库

本文围绕C语言学习展开,介绍了ANSI、ISO、GNU等组织,阐述了ANSI C与ISO C标准的关系及C89、C99、C11等标准。还提及交叉编译,介绍了POSIX、SVID、XPG等其他标准,以及c标准库、POSIX标准库、GNU C库。最后给出C语言开发的学习建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习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标准定义的头文件:

<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语言学习总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值