strcmpi重命名为_strcmpi?

时间:2009-12-27 00:59:35

标签: c++ c string strcmp

在MSVC ++中,有一个函数strcmpi用于不区分大小写的C字符串比较。

当你尝试使用它时,它会去,

从Visual C ++ 2005开始,不推荐使用此POSIX函数。请改用ISO C ++符合_stricmp。

我没看到的是为什么ISO不希望MSVC ++使用strcmpi,为什么_stricmp是首选方式,为什么他们懒得重命名函数,以及函数如何以符合下划线的ISO开头。我知道所有这一切都有理由,我怀疑它是因为strcmpi是非标准的,也许ISO希望非标准扩展以_underscore开头?

4 个答案:

答案 0 :(得分:13)

ISO C保留某些标识符以供将来扩展(请参阅here),包括以“str”开头的任何内容。

答案 1 :(得分:11)

IMNSHO,这是微软的说法“不要把Unix软件放在Windows机器上”。这个问题有几个令人沮丧的方面:

  1. strcmpi()不是POSIX函数 - 相关函数在<strings.h>中定义,称为strcasecmp()等。
  2. 即使您明确要求支持POSIX功能,Microsoft也认为您不能使用POSIX名称,但必须在它们前面添加可怜的下划线。
  3. AFAIK,没有办法覆盖MSVC编译器对该问题的看法。
  4. 也就是说,GCC工具链对某些功能有点粗略 - mktemp()等。但是,尽管有警告(这是合理的),它确实可以成功编译和链接。

    我注意到MSVC在它的发动机罩上也有一只蜜蜂snprintf()等。如果它们的功能符合C99标准(以及编译器的其余部分),那么就不会有任何溢出的风险 - 标准要求空终止,这与微软的说法相反。

    我对这个问题没有一个很好的解决方案 - 我不确定是否有一个。一种可能性是创建一个标题(或标题集)来映射所有实际的POSIX名称,以微软对它们的误解。另外两个是创建一个具有正确POSIX名称的普通函数库,每个名称都调用到Microsoft版本的名称(为您提供大量的四行函数集合 - 声明行,开括号,紧支撑,以及返回语句,用于调用POSIX函数名称的Microsoft变体。

    有趣的是,Microsoft API调用也会污染用户的名称空间,不会弃用或重命名。

答案 2 :(得分:3)

C ++标准为C ++实现保留了以下划线和小写字母开头的名称,如果它们在全局命名空间中声明的话。这可以阻止它们与您自己的代码中的类似名称冲突,这些名称不能使用此命名约定。

答案 3 :(得分:2)

strcmpi在Visual C ++ 2008中完全消失了,所以如果你打算升级,你一定要注意这个弃用。

_不会使函数成为ISO标准,只是以_开头的函数随着语言的发展而更安全,因为这是为该语言保留的命名空间的一部分。

根据Microsoft's documentation for _stricmp,听起来strcmpi有一些做法导致一些不直观的排序(包括规范化为小写而不是简单地将案例视为不相关)。听起来像_stricmp需要更多的痛苦才能做出人们自然期望的事情。