什么是POSIX,可以取代它的任何其他接口标准?

har*_*ris 13 c c++ standards posix standard-library

我对C和C++编程的众多标准和接口感到困惑.有ANSI C,ISO C,GLIBC,POSIX,Win32,MFC等.这些标准之间有什么区别,它们如何相互关联?在什么情况下你会选择一个特定的标准?是否有显示关系的图表?

Die*_*Epp 24

ANSI/ISO C.

ANSI C/ISO C是旨在支持令人难以置信的各种不同系统的标准,并允许从过去时代编译遗留代码.我们可以称之为"标准C".因为C是标准化的,所以有很多实现.

C标准的一半是指语言本身,其中包括有关可用类型的具体保证,可以使用的语法等等.这些保证有时过于宽泛而无法舒适地工作.例如,在标准C中,保证至少存在以下类型:

  • short int,至少代表-32767 .. + 32767
  • int,至少代表-32767 .. + 32767
  • long int,代表至少-2147483647 .. + 2147483647

列表中的每种类型都必须比最后一种更宽,但系统有很多余地可供选择不同的大小.例如,在DSP或旧的超级计算机上,所有类型的大小可能完全相同.也不能保证一个字节有8位(也许它有8位以上).

C标准的另一半指定标准库,例如每个头提供哪些功能.例如,<stdlib.h>标头必须定义该malloc()功能.

用标准C编写的程序几乎可以在任何地方运行,只要你小心不要依赖非便携式结构.但是,C标准并没有提供太多的功能......所以这些便携式程序除了打开文件或从控制台上的用户读取输入外,还做不了多少.

标准C有几个版本.最常见的是C89/C90,C99和C11.找到仅支持C90的系统(例如,MSVC)并不罕见.

POSIX

POSIX是一个更大,更全面的标准,其中包括标准C作为其一部分.POSIX还指定了操作系统的各个部分.因为POSIX是标准化的,所以有很多实现.

在POSIX系统上,C实现有一些限制.例如,在POSIX上:

  • 一个字节总是8位
  • 整数总是二进制补码
  • /字符始终用作路径分隔符
  • 设置会发出某些错误信号 errno

POSIX还指定了标准库的一些附加内容,例如

  • 网络套接字
  • 创建新流程
  • 多线程编程
  • 内存映射IO

编写在POSIX上运行的程序可以在Linux,Unix,OS X或其他符合POSIX的系统上运行.这些程序通常需要额外的工作才能在Windows上运行.POSIX标准包括用于网络,进程创建,shell,终端和文件系统的接口.编写复杂的POSIX程序(如Web服务器或命令行shell)并不困难.

有几个版本的POSIX.

GLIBC

GLibc是GNU C库.它实现了标准C库,C库的POSIX扩展以及一些额外的功能.GLibc不是标准化的,只有一个实现.

例如,GLibc提供asprintf(),sprintf()它就像是自动分配缓冲区.

使用GLibc扩展的程序通常不是可移植的,尽管BSD系统上也可以使用某些扩展.

Win32的

Win32是Windows特有的API.API提供标准C中不可用的功能,例如用于创建图形用户界面的功能.Win32没有标准化,只有两个实现(Windows和WINE).Win32提供了大量接口,例如:

  • 网络套接字
  • 创建新流程
  • 多线程编程
  • 内存映射IO

这些接口与POSIX重叠,但函数调用大多不同.例如,在Windows上,您可以创建一个互斥锁CreateMutexEx(),并在POSIX上创建一个互斥锁pthread_mutex_init().例外的是网络套接字,它们在Windows和POSIX之间大致相同.

为Win32编写的程序通常只能在Windows和WINE上运行.

MFC

MFC是Microsoft提供的库,可以更轻松地编写Win32应用程序.它实际上已经过时,不应该用于新项目.MFC没有标准化,只有一个实现.

  • 这是 Wiki'd 所以请继续编辑它而不是评论它来要求我更新它。 (2认同)