我正在将一个
Windows库移植到
Android(使用GNU标准C库选项,libstdc -v3),VC和GNU库之间似乎存在许多命名差异,例如:
> _stricmp被称为strcasecmp
> _unlink称为取消链接
> _scalb被称为scalbn
> _finite被称为isfinite
> _isnan被称为isnan
> _itoa和itoa似乎不存在于GNU C中
> 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”似乎没有提供功能列表.
解决方法
这与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中下划线激增的原因.