C ++标准库与POSIX等系统接口标准之间有什么关系?

时间:2015-11-18 09:43:21

标签: c++ posix c++-standard-library

最近我从同事那里得到一个问题,Dinkumware C ++标准库是否支持POSIX,我不知道如何回答这个问题。对我而言,目前尚不清楚两者之间的关系。

C ++标准库是否提供POSIX接口的实现?或者两个实际上是两个不相互关联的东西,但在开发过程中可以串联使用?

我做了一些谷歌搜索,但无法得出任何结论。本文描述了POSIX和标准C之间的区别,但是C ++标准库呢? Difference Between POSIX and Standard C Library

任何启示都将受到赞赏!

3 个答案:

答案 0 :(得分:3)

  

Dinkumware C ++标准库是否支持POSIX ...对我而言,目前尚不清楚两者之间的关系。

POSIX是操作系统界面的标准。 C ++标准库不是操作系统,因此需要详细说明这个问题。

C ++标准库不需要POSIX,POSIX不需要C ++标准库。但是,C ++标准需要一些与POSIX兼容的东西:

  

如果将C ++程序的声明或定义添加到命名空间posix或命名空间posix中的命名空间,则C ++程序的行为是未定义的,除非另有说明。名称空间posix保留供ISO / IEC 9945和其他POSIX标准使用。

     

全局命名空间posix现在保留用于标准化。在本国际标准中,使用顶级命名空间posix的有效C ++ 2003代码可能无效。

     

对于基于POSIX的操作系统,鼓励实现将std :: system_category()值定义为与POSIX errno值相同,并使用操作系统文档定义的其他值。鼓励不基于POSIX的操作系统实现定义与操作系统值相同的值。对于不是源自操作系统的错误,实现可以提供关联值的枚举。

     

调用POSIX函数setenv和putenv修改环境。

     

表43中描述了标题<cerrno>。其内容与POSIX标题<errno.h>相同,只是errno应定义为宏。 [注意:目的是保持与POSIX标准紧密结合。 - 结束说明]

     

streamsize用于ISO C将使用size_t的大多数地方。除了需要负值的strstreambuf构造函数之外,streamsize的大多数用法都可以使用size_t。它应该是对应于size_t的签名类型(这是Posix.2调用ssize_t的内容)。

     

指定正则表达式引擎识别的语法应为POSIX,基本定义和标题,第9节,正则表达式中的基本正则表达式使用的语法。

尽管POSIX基于C标准库并且遵循它,并且C标准库是C ++语言规范的一部分,但C ++标准库通常不实现C标准库。

另一方面,C标准库可以实现POSIX所需的功能。来自The New C Standard: An Economic and Cultural Commentary的一些引用:

  

C库中的某些函数与POSIX定义的函数具有相同的名称。 POSIX是一种基于API的标准(本质上是一个完整的操作系统),供应商对实现POSIX功能表现出更多的兴趣。

     

大多数托管环境都提供此处指定的完整功能集。 POSIX(ISO / IEC 9945)标准定义了C库中的一些功能。总的来说,这个功能的规范是C规范的纯粹扩展。

     

与POSIX不同,C标准不禁止使用其他标准中的函数,宏,类型定义和对象,但此类库不得更改任何C定义的库函数的行为。

     

在大多数实现中,一个字节占用8位。 POSIX标准要求CHAR_BIT的值为8. Digital DEC 10和Honeywell / Multics使用基于9位字节的底层存储组织的36位字。一些DSP芯片具有16位或32位字符类型(这通常与可寻址性问题有关,而不是字符集大小)。

     

系统头文件中定义的结构或联合类型的特殊之处在于,开发项目很少能够控制其内容。这些系统头中定义的结构和联合类型的成员可能因供应商而异。通过dirent结构提供在相同结构类型中看到的不同结构构件的示例。 POSIX.1标准要求此结构类型包括成员d_name和d_namelen。开放组单Unix规范更进一步,要求成员d_ino也必须存在。查看Linux上的系统头文件,我们发现它还包括成员d_off和d_type; ...

答案 1 :(得分:2)

我想说C ++标准库和C标准库完全在同一级别上运行。这意味着您会发现那些允许执行潜在复杂操作的实用程序,但对底层操作系统的要求很低 - 因为它们必须可以在所有体系结构中移植。

另一方面的Posix处理OS层。所以恕我直言,几乎所有在参考文章中写的都适用于C ++标准库。主要区别在于它现在是一个 C ++ 库而不是 C Posix一个。这意味着除了可移植性之外,您还可以获得类型控制,覆盖和所有其他C ++好东西。

答案 2 :(得分:1)

POSIX通过引用明确地将C标准纳入2004年:

  

POSIX.1-2008中提供的设施来自以下基础文件:[...]

     

ISO / IEC 9899:1999,编程语言-C,包括ISO / IEC 9899:1999 / Cor.1:2001(E),ISO / IEC 9899:1999 / Cor.2:2004(E)和ISO / IEC 9899:1999 / Cor.3

它还包含了Fortran-78标准,没有定义系统接口,并说,“其他相关标准或未来版本中可能提供其他语言绑定和开发实用程序选项。”在大多数实际系统中,有一个单个&#34; C库&#34;包含两个标准的所有绑定。

Maxim Egorushkin有一些尝试与POSIX兼容的语言标准示例。

POSIX的不寻常之处在于它为标准系统头添加了新功能和保证。大多数系统库与标准库相比更加独立:如果您为Windows编写程序,则包括<windows.h>和标准库头。 C库函数链接到MSVC运行时DLL,而系统调用链接到KERNEL,GDI等。但是,通常,您需要使用编译器提供的系统和标准库,并链接到其运行时。