strcmpi重命名为_strcmpi?

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

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

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

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

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

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

  1. strcmpi()不是POSIX函数 – 相关函数在中定义,称为strcasecmp()等。
  2. 即使您明确请求支持POSIX函数,Microsoft也认为您不能使用POSIX名称,但必须在它们前面添加可怜的下划线。
  3. AFAIK,没有办法覆盖MSVC编译器对该问题的看法。

也就是说,GCC工具链对某些function有点粗略 – mktemp()等。 但是,尽管有警告(这是合理的),它确实可以成功编译和链接。

我注意到MSVC在其发动机罩中也有一个关于snprintf()等的蜜蜂。 如果它们的function符合C99标准(以及编译器的其余部分),则永远不会有任何溢出的风险 – 标准要求空终止,与Microsoft的声明相反。

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

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

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

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

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

根据微软针对_stricmp的文档 ,听起来strcmpi有一些做法导致一些不直观的排序(包括规范化小写而不是简单地将案例视为无关紧要)。 听起来像_stricmp需要更多的痛苦来做自然期望的事情。