strcmpi重命名为_strcmpi?

bob*_*obo 9 c c++ string strcmp

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

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

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

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

Mar*_*tos 13

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


Jon*_*ler 12

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

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

也就是说,海湾合作委员会的工具链对某些功能有点粗略 - mktemp()等等.但是,尽管有警告(这是合理的),它确实可以成功编译和链接.

我注意到,MSVC也有一个关于snprintf()等人的帽子.如果它们的功能符合C99标准(以及编译器的其余部分),则永远不会有任何溢出的风险 - 标准要求空终止,与Microsoft的声明相反.

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

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

  • 说得好!同样令人烦恼的是MSVC如何坚持在不安全的库函数上发出警告,而应该使用*_s变体. (4认同)