在MSVC ++中,有一个函数strcmpi用于不区分大小写的C字符串比较。
当你尝试使用它时,它会去,
从Visual C ++ 2005开始,不推荐使用此POSIX函数。请改用ISO C ++符合_stricmp。
我没看到的是为什么ISO不希望MSVC ++使用strcmpi,为什么_stricmp是首选方式,为什么他们懒得重命名函数,以及函数如何以符合下划线的ISO开头。我知道所有这一切都有理由,我怀疑它是因为strcmpi是非标准的,也许ISO希望非标准扩展以_underscore开头?
答案 0 :(得分:13)
ISO C保留某些标识符以供将来扩展(请参阅here),包括以“str”开头的任何内容。
答案 1 :(得分:11)
strcmpi()
不是POSIX函数 - 相关函数在<strings.h>
中定义,称为strcasecmp()
等。也就是说,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
需要更多的痛苦才能做出人们自然期望的事情。