为什么Windows和Linux之间的标准库函数名称不同?

时间:2012-03-27 19:34:51

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

我正在将一个Windows库移植到Android(使用GNU标准C ++库选项,libstdc ++ - v3),VC和GNU库之间似乎有很多命名差异,例如:

  • _stricmp被称为strcasecmp而不是
  • _unlink被称为unlink
  • _scalb被称为scalbn
  • _finite被称为isfinite
  • _isnan被称为isnan
  • GNU C ++中似乎不存在
  • _itoaitoa
  • atoi确实存在,但不存在atoi64

VC和GNU库的文档意味着它们实现了“ISO”C ++,例如我可以从VC2008中获得一些警告而不使用“ISO C ++”名称,例如:“警告C4996:' itoa':不推荐使用此项目的POSIX名称。而是使用符合ISO C ++标准的名称:_itoa。“类似地,GNU的手册说“GNU标准C ++库v3是一个实现ISO 14882标准C ++库的持续项目”。

那么图书馆如何最终得到这些不同的名字呢?如何判断哪些名称更“标准”?

此外,libstdc ++ - v3的索引是否存在,即库中所有函数的简单列表?我只能找到manual和“source documentation”,它似乎没有提供功能列表。

3 个答案:

答案 0 :(得分:12)

这与C ++标准库几乎没有关系。它更多地与C99和POSIX有关。

  • strcasecmp是libstdc ++碰巧实现的POSIX函数。 msvcrt通常与POSIX保持一定的距离。
  • unlink类似 - 它是POSIX函数。
  • scalbn是C99标准中函数的名称。 MSVC不支持C99。但是,scalbn是C ++ 11的一部分,所以我希望它最终会出现在msvcrt中。
  • isfiniteisnan都是C99。
  • itoa既不是C99也不是POSIX。这是一种奇怪的野兽,只是在夜晚出现。

我还要指出其他几个人已经指出的问题:在技术上更加正确的做法是在标准库中为任何实际上非标准的下划线添加前缀。这就是msvcrt中下划线扩散的原因。

答案 1 :(得分:2)

它们都不是标准的。该标准确实说你不应该添加名称,但这就是警告实际意味着什么。下划线使它们符合标准,因为它们不会被混淆为标准C / C ++中的东西。

他们暗示通过添加下划线,您的代码将使用标准中的某些内容,但两个版本都没有。

答案 2 :(得分:1)

我想任何实现都可以调用它们的实现“ISO标准”,如果它们将_添加到函数名称并执行他们想要的任何操作,因为这些标识符保证保留给按标准执行。但它们也不能保证便携。