2012-03-27 38 views
6

我移植一个Windows库到Android(与GNU标准C++库选项,的libstdC++ - v3)和那里似乎是VC和GNU库之间的许多命名的差异,例如:为什么Windows和Linux之间的标准库函数名称不同?

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

两个VC和GNU库的文档意味着他们实施“ISO “例如,我可以从VC2008中获得一些警告,不使用”ISO C++“名称,例如:”警告C4996:'itoa':不推荐使用此项目的POSIX名称。相反,使用ISO C++一致性名称:_itoa。“同样,GNU的手册中说”GNU标准C++库v3是一个正在进行的项目,用于实现ISO 14882标准C++库“

那么库如何结束?不同的名字,我怎么知道哪个名字更“标准”

此外,有没有一个指数的libstdC++ - V3的任何地方,即库中的所有功能,一个简单的列表,我只能找到一个manual和“source documentation”,它似乎没有提供功能列表。

+8

其中有几个不在C++标准库中,所以在这些情况下,都不是“标准”。 – 2012-03-27 19:37:26

+2

微软正在试图通过将其非标准功能命名为前导下划线来保持一致。 – 2012-03-27 19:46:14

+1

MSVC中的'_atoi64'在GCC中被称为'atoll'。 – dan04 2012-03-29 23:35:30

回答

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下划线扩散的原因。

+0

所以下划线表示“编译器特定”。谢谢,还有一件事:你是否随着时间的推移学习了这些东西,还是有一种简单的方法来确定是否有任何给定的函数是POSIX,C99,C++ 11中的新增功能等等?同时使用POSIX和C/C++标准中的任何函数吗? – Qwertie 2012-03-27 20:11:12

+0

我想所有由MSVC实现的POSIX方法都有一个下划线,而所有由GNU实现的POSIX方法都没有下划线。我需要为我的代码定义一个通用名称,因此,你认为最好是在通用名称中使用下划线(“#ifdef LINUX int _unlink(const char * p){...}” )或不是(“#ifdef WIN32 int unlink(const char * p){...}”)? – Qwertie 2012-03-27 20:18:58

+0

哦,并且 - 对不起,我一直在想更多的问题 - 在Windows和Linux中是否有可用的替代名称?例如,不是POSIX unlink()或C99 scalbn(),是否有ISO标准C++函数用于删除文件或将某些内容添加到浮点数上的指数上?还是没有办法编写真正的可移植的C++代码? – Qwertie 2012-03-27 20:31:07

1

我想任何实现可调用其执行“ISO标准”,如果他们预先准备_的函数名和为所欲为,因为这些标识符是保证将保留通过标准的实施。但他们也不能保证便携。

2

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

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

相关问题