新浪博客

ANSIC、ISOC、GNUC、POSIXC(转)

2020-03-26 18:08阅读:
几句话了解C标准之间的关系
C语言标准
早期的计算机汇编语言是与机器平台紧密耦合的,为了屏蔽这种耦合,增加代码的可移植性,C语言随机出现。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
与ANSI C标准同时出现的就是ISO组织,将ANSI C加入了ISO的大家庭,定义了ISO C。除了在格式和排版等方面存在一些差别外,其他都与ANSI C相同。
所以一句话ANSI C与ISO C 对于我们开发者来说完全相同。
目前出现的C标准如下:
C89
C99
C11
对于编程来说,不同的机器平台的编译器可能不同,但是他必须按照ISO C的标准来实现,即他必须支持对于C标准的语法规则的编译。当然随着C标准的演进,编译器也是需要随之演进的,比如当前的C11标准,不是所有的编译器均支持。
交叉编译,就是在一个平台上通过交叉编译器,编译另个平台上运行的程序。编译器起到重要作用哦~
C标准库
C标准库是严格按照C标准规范实现的一个C库,在Linux下有个叫libc的库就是标准库了。有些Linux下可能已经和glibc打包到一起了。
起初的C标准库存在15个头文件(后续介绍),我认为这15个头文件是我们作为C开发者必须知道的。每个语言的诞生都会有一些语言对应的库提供给开发者,这是一个语言能够发展起来的基础。(个人理解哈~)
POSIX C
说起POSIX C有人会鄙视我,说根本就没有POSIX C,对是没有POSIX C标准,但是有POSIX C库。
首先要理解什么事POSIX,全称:可移植操作系统
接口。故名思议,由于当时Unix诞生之后,由于各个厂商都实现自己的Unix(都敢使用Unix,由于版权的问题),接口的不统一,导致在各个厂商下基于不同的操作系统开发变得很乱,为了解决这一问题,便有了POSIX标准。
一句话:POSIX标准的诞生是为了统一个操作系统的接口,方便开发者开发程序,写出可移植的代码程序。基于POSIX标准的库函数都是可以在持之此标准的操作系统平台上移植的。
我们说的posix c库就是基于POSIX标准定义的一套头文件实现的lib库。
所以说我们man手册中经常会看到POSIX Program信息,表示是遵循POSIX标准而实现的。
展示一下ANSI C和POSIX C库的头文件哪些。如下展示的C标准库头文件是被扩展之后的标准,而不是起初的标准库了。增加了一些功能。
http://www.cnitblog.com/guopi...



GNU C
GNU 是一个自由软件基金会,GNU's Not Unix.
GNU 是为了实现自由开源目的一个基金会,它提供了很多基于POSIX标准的软件和库,比如glibc、gcc、emacs等等。
聊到这里就要聊聊Linux了,Linux诞生相信大家都听说过了,此处不再提。由于Linux开发者拥护GNU理念,将Linux也就遵循了GNU标准,并且Linux的开发也使用了GNU提供的大量的库函数。
所以每个Linux版本都存在glibc的库。
Linux为了兼容性考虑在设计之初就按照POSIX标准,支持了POSIX标准。
GNU C叫做glibc是Linux上的一个基础库,glibc C实现了POSIX C标准的库函数功能,有些POSIX标准是单独的库函数存在的
小插曲:由于GNU组织没有开发出很完善的操作系统内核,使用了Linux内核,所以将Linux纳入进来,又由于GNU组织存在很多开源的很好的工具组件促使Linux快速成长,所以说GNU和Linux是相互成全。(个人感觉仅供参考~)
C语言学习个人总结
想要使用C语言开发软件系统,必须了解C标准包括语法规则,其次了解C标准库清楚哪些基础库可以使用,使用时再查也是可以的。
对于C标准库应该各个操作系统平台都支持,放心使用即可。
在类Unix、Linux操作系统上编程,当然要学习POSIX标准,了解POSIX提供了哪些编程接口,方便快速开发。
在Windows上当然也有一套编程接口,不了解不瞎哔哔了。但是:不是说windows完全不支持POSIX标准。Windows NT-based 系统不能直接支持新版POSIX接口,仅支持第一版POSIX v1:ISO/IEC9945-1:1990[1]版标准。由于仅支持第一版POSIX的Windows NT-based系统不能创建符合POSIX接口标准的线程和窗体、套接字,所以微软公司提供POSIX兼容层Microsoft POSIX subsystem软件包(Windows Services for UNIX)以支持新版POSIX接口,Windows 系统还可以运行其他POSIX兼容层例如Cygwin.
C标准不断的演进有些新增语法也是值得学习的,毕竟新增的语法和头文件更加方便我们开发程序。
GNU C中存在一些对于C标准的优化,如果是在Linux上开发程序,那我们应该大胆的使用它,方便我们程序的开发。例如关于__attribute__的机制就是GNU C的一大特色。所以关于GNU C我们也是要好好的学习一下的。



POSIX.1 and ISO C标准头文件
ISO C标准定义的头文件(24项)
assert.h ---------------------- 验证程序断言
complex.h ---------------------- 支持复数算术运算
ctype.h ---------------------- 字符类型
errno.h ---------------------- 出错码
fenv.h ---------------------- 浮点环境
float.h ---------------------- 浮点常量
inttypes.h ---------------------- 整型格式转换
iso646.h ---------------------- 替代关系操作符宏
limits.h ---------------------- 实现常量
locale.h ---------------------- 局部类别
math.h ---------------------- 数学常量
setjmp.h ---------------------- 非局部goto
signal.h ---------------------- 信号
stdarg.h ---------------------- 可变参数表
stdbool.h ---------------------- 布尔类型和值
stddef.h ---------------------- 标准定义
stdint.h ---------------------- 整型
stdio.h ---------------------- 标准I/O库
stdlib.h ---------------------- 实用程序库函数
string.h ---------------------- 字符串操作
tgmath.h ---------------------- 通用类型数学宏
time.h ---------------------- 时间和日期
wchar.h ---------------------- 扩展的多字节和宽字符支持
wctype.h ---------------------- 宽字符分类和映射支持

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 ---------------------- 时间跟踪

我的更多文章

下载客户端阅读体验更佳

APP专享