我对 C 和 C++ 编程的众多标准和接口感到困惑。有 ANSI C、ISO C、GLIBC、POSIX、Win32、MFC 等等。这些标准之间有什么区别,它们之间有什么关系?在什么情况下你会选择一个特定的标准?有图表显示关系吗?
1 回答
ANSI / ISO C
ANSI C / ISO C 是旨在支持极其广泛的不同系统的标准,并允许编译过去的遗留代码。我们可以称之为“标准C”。因为C是标准化的,所以有很多实现。
C 标准的一半是指语言本身,其中包括关于可用类型、可以使用什么语法等的具体保证。这些保证有时过于宽泛,无法舒适地使用。例如,在标准 C 中,保证至少存在以下类型:
short int
, 至少代表 -32767..+32767int
, 至少代表 -32767..+32767long 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 没有标准化,只有一种实现。