C++ g++;错误:‘;stricmp&x2019;未在此作用域中声明(但对于';strcmp';,可以)

C++ g++;错误:‘;stricmp&x2019;未在此作用域中声明(但对于';strcmp';,可以),c++,g++,C++,G++,我试图编译以下非常简单的源代码: #include <cstring> // #include <string.h> // using namespace std; class Helper { public: int cStringsAreEqual(const char *s1, const char *s2) { return stricmp(s1, s2); } }; 然而,当我使用strcmp()而不是stricmp()时,一

我试图编译以下非常简单的源代码:

#include <cstring>
// #include <string.h>
// using namespace std;

class Helper {
public:
    int cStringsAreEqual(const char *s1, const char *s2) {
        return stricmp(s1, s2);
    }
};
然而,当我使用strcmp()而不是stricmp()时,一切都很好

这里有什么问题?当strcmp()被允许时,stricmp()不应该被允许吗

Sureley,不用strcmp/stricmp,这一切都可以用更好的方式编写

但这不是重点

我正在移植一个软件,它充分利用了对stricmp()的调用。如果可能的话,我想避免所有改变每一个呼叫的努力

在此方面的任何帮助都将不胜感激

顺便说一句:我正在使用UbuntuKarmicOS(v9.10)和g++v4.4.1


顺便说一句:正如你所看到的,我也对“#include string.h”或“namespace std”进行了一些尝试,但没有任何帮助。

,因此,如果编译器或标准库严格遵守POSIX或ANSI标准库函数(GCC套件可能就是这种情况),是否允许使用strcmp,其实并不重要.

试试
strcasecmp()
。这是它的理由。它符合4.4BSD和POSIX.1-2001的要求。

添加一个定义,以便在您所寻找的平台上用stracecmp覆盖stricmp

#ifdef _IPHONE <- your platform define here
#define stricmp strcasecmp
#define strnicmp strncasecmp
#endif

#ifdef(IPHONE如果需要,可以很容易地制作自己的IPHONE

int my_stricmp (const char *s1, const char *s2)
{
    while (*s1 != 0 && *s2 != 0)
    {
        if (*s1 != *s2 && ::toupper (*s1) != ::toupper(*s2))
        {
            return -1;
        }
        s1++;
        s2++;
    }
    return (*s1 == 0 && *s2 == 0) ? 0 : -1;
}

如果您有Boost,请在
中使用
Boost::algorithm::iequals(s1、s2、std::locale::classic())
(或者如果您希望区分区域设置,请禁用区域设置)。它适用于C字符串、
std::[w]string
vector
等。

考虑到stricmp和strcmp不一样(后者区分大小写),您可能希望在更改它们之前先犹豫一下。我知道它们不一样。这就是为什么我想使用stricmp而不是strcmp。请注意,
并不完全相同。这不是问题的原因,但您需要编写
std::strcmp
(或
std::strcoll
)而不是假设名称被导入全局名称空间。这很复杂,因为“区分大小写”的概念可能取决于您的区域设置或操作系统。看看这个问题的一些答案:我在Windows7上使用EclipseCDT和Cygwin,stricmp在那里是可以接受的。在我的Linux机器上,使用GCC时,它是不可接受的。这是否意味着Cygwin附带的编译器不是POSIX或ANSI?这将是一个选项。strcasecmp()似乎具有相同的参数。因此,创建一个能够进行全局更改的小型perl脚本应该不难。谢谢!没问题。还可以看看MarkRushakoff关于语言环境设置如何影响此函数的评论。请注意strcasecmp取决于您的语言环境。因此,strcasecmp(“div”、“div”)在土耳其语言环境中不会返回0(小写字母I为ı)。这意味着你的字符串来自哪里很重要:-(。其他语言中还有其他示例。你可能会为外国用户中断程序。我们把这个想法放在哪里?只需将它放在标题中,或者用任何其他预处理器指令(ifdefs/defines)放在顶部即可:#define#IPHONE将切换到上面的用法减去“当
s1
排序晚于
s2
时,它如何返回正值?或者它是否打算与
std::strcmp()有不同的接口?”<代码> > TobySpeight指出,也纠正了逻辑。<代码> CaveS/<代码>:调用Topp>:/ToopP<代码>是特定于区域的。根据您在哪里运行,您可能会得到不同的结果。请考虑使用区域设置的重写代替。@杰西,您提出的更改是相当大的,因此被RE拒绝。观众。你可能想添加一些解释,并将其转化为正确的答案。
int my_stricmp (const char *s1, const char *s2)
{
    while (*s1 != 0 && *s2 != 0)
    {
        if (*s1 != *s2 && ::toupper (*s1) != ::toupper(*s2))
        {
            return -1;
        }
        s1++;
        s2++;
    }
    return (*s1 == 0 && *s2 == 0) ? 0 : -1;
}