我正在将一个Windows库移植到Android(使用GNU标准C ++库选项,libstdc ++ - v3),VC和GNU库之间似乎有很多命名差异,例如:
_stricmp
被称为strcasecmp
而不是_unlink
被称为unlink
_scalb
被称为scalbn
_finite
被称为isfinite
_isnan
被称为isnan
_itoa
和itoa
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”,它似乎没有提供功能列表。
答案 0 :(得分: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中下划线扩散的原因。
答案 1 :(得分:2)
它们都不是标准的。该标准确实说你不应该添加名称,但这就是警告实际意味着什么。下划线使它们符合标准,因为它们不会被混淆为标准C / C ++中的东西。
他们暗示通过添加下划线,您的代码将使用标准中的某些内容,但两个版本都没有。
答案 2 :(得分:1)
我想任何实现都可以调用它们的实现“ISO标准”,如果它们将_
添加到函数名称并执行他们想要的任何操作,因为这些标识符保证保留给按标准执行。但它们也不能保证便携。