C++ strcmpi重命名为_strcmpi?

C++ strcmpi重命名为_strcmpi?,c++,c,string,strcmp,C++,C,String,Strcmp,在MSVC++中,有一个用于不区分大小写的C字符串比较的函数 当你尝试使用它时,它会 这个POSIX函数在Visual C++ 2005中被禁止。使用ISO C++的一致性。 我不明白的是,为什么ISO不希望MSVC++使用strcmpi,为什么stricmp是首选方法,为什么他们会费心重命名函数,以及一个以下划线ISO一致开头的函数是如何开始的。我知道这一切一定有原因,我怀疑它是因为STRCPMI是非标准的,也许ISO需要非标准的扩展来开始一个下划线?< /P> < P> >一个下划线的名字,

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

当你尝试使用它时,它会

这个POSIX函数在Visual C++ 2005中被禁止。使用ISO C++的一致性。
我不明白的是,为什么ISO不希望MSVC++使用strcmpi,为什么stricmp是首选方法,为什么他们会费心重命名函数,以及一个以下划线ISO一致开头的函数是如何开始的。我知道这一切一定有原因,我怀疑它是因为STRCPMI是非标准的,也许ISO需要非标准的扩展来开始一个下划线?< /P> < P> >一个下划线的名字,一个小写字母是由C++标准为C++实现保留的,如果它们在全局命名空间中声明的话。这就阻止了它们在自己的代码中以类似的名称冲突,它不能使用这个命名约定。

< P> ISOC保留了一些用于将来扩展的标识符(参见),包括从“STR”开始的任何东西。VisualC++ 2008中

< > >代码> STRMPMI/COD>完全消失,因此,如果你打算升级,你一定要留意这些反对意见

_u并没有使函数成为ISO标准,只是随着语言的发展,以u开头的函数可以更安全地添加,因为这是保留给语言使用的名称空间的一部分


根据,听起来好像strcmpi有一些实践导致了一些不直观的顺序(包括规范化为小写,而不是简单地将大小写视为不相关)。听起来好像要花更多的精力去做人们自然期望的事情。

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

  • strcmpi()
    不是POSIX函数-相关函数在中定义,称为
    strcacemp()
  • 即使您明确请求对POSIX函数的支持,Microsoft认为您可能不会使用POSIX名称,但必须在它们前面加上可怜的下划线
  • 顺便说一句,没有办法覆盖MSVC编译器对这个问题的看法
  • 这就是说,GCC工具链对一些函数有点苛刻-
    mktemp()
    等。然而,尽管有警告(这些警告是合理的),它还是成功地编译和链接了

    我注意到,MSVC还有一个关于
    snprintf()
    等的帽子。如果它们的函数符合C99标准(以及编译器的其余部分),那么就永远不会有溢出的风险-该标准要求空终止,这与Microsoft的声明相反

    我还没有一个很好的解决这个问题的方法——我不确定有没有。一种可能是创建一个标题(或一组标题),将所有实际的POSIX名称映射到Microsoft对它们的误解。另一种方法是创建一个具有正确POSIX名称的普通函数库,每个函数都调用该名称的Microsoft版本(提供了四行函数的大量集合—声明符行、开放大括号、关闭大括号和调用POSIX函数名称的Microsoft变体的返回语句)


    有趣的是,同样污染用户名称空间的Microsoft API调用没有被弃用或重命名。

    说得好!MSVC坚持对不安全的库函数发出警告,并且应该使用*的变体。请注意,Visual Studio 2015现在有
    vsnprintf()的版本
    等,至少符合C99,以及(向后兼容且不变)
    \u vsnprintf()
    版本。