6

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

  • _stricmpstrcasecmp改为调用
  • _unlink叫做unlink
  • _scalb叫做scalbn
  • _finite叫做isfinite
  • _isnan叫做isnan
  • _itoa并且itoa在 GNU C++ 中似乎不存在
  • atoi确实存在,但不存在atoi64

VC 和 GNU 库的文档都暗示它们实现了“ISO”C++,例如,我可以从 VC2008 中得到一些警告,因为它们没有使用“ISO C++”名称,例如:“warning C4996: 'itoa':不推荐使用此项目的 POSIX 名称。改为使用符合 ISO C++ 的名称:_itoa。同样,GNU 的手册说“GNU 标准 C++ 库 v3 是实施 ISO 14882 标准 C++ 库的持续项目”。

那么这些库是如何以这些不同的名称结束的呢?我怎么知道哪些名字更“标准”?

此外,是否有任何地方的 libstdc++-v3索引,即库中所有函数的简单列表?我只能找到一本手册和似乎没有提供功能列表的“源文档”。

4

3 回答 3

12

这与 C++ 标准库关系不大。它与 C99 和 POSIX 有更多关系。

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

我还要指出其他几个人所指出的:在标准库中为实际上非标准的任何函数加上下划线前缀在技术上更正确。这就是 msvcrt 中下划线泛滥的原因。

于 2012-03-27T19:44:59.183 回答
2

它们都不是标准的。该标准确实说您不应该添加名称,但这就是警告的实际含义。下划线使它们符合标准,因为它们不会与标准 C/C++ 中的内容混淆。

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

于 2012-03-27T19:45:36.437 回答
1

我想任何实现都可以将它们的实现称为“ISO 标准”,如果它们附加_到函数名称并做他们想做的任何事情,因为这些标识符保证被标准保留给实现。但它们也不能保证是便携的。

于 2012-03-27T19:45:04.173 回答