g ++错误:'stricmp'未在此范围内声明(但'strcmp'确定)

时间:2009-11-23 17:41:38

标签: 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);
    }
};

...但我收到以下错误消息:

   g++ error: ‘stricmp’ was not declared in this scope

然而,当我使用 strcmp()而不是 stricmp()时,一切都很好!

这里有什么不对?当strcmp()被允许时,是否应该允许stricmp()?

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

但这不是重点。

我正在移植一个软件 - 它大量使用了对stricmp()的调用。如果可能的话,我想避免所有改变每次调用stricmp所需的努力。

非常感谢任何帮助!

BTW:我正在使用Ubuntu karmic OS(v9.10)和g ++ v4.4.1。

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

5 个答案:

答案 0 :(得分:35)

试试strcasecmp()。这是它的manual page。它符合4.4BSD和POSIX.1-2001。

答案 1 :(得分:14)

stricmp is neither POSIX nor ANSI,如果您的编译器或标准库严格遵守POSIX或ANSI标准库函数,则允许strcmp并不重要(GCC可能就是这种情况)套件)。

答案 2 :(得分:11)

为它添加一个定义,用你要查找的平台上的strcasecmp覆盖stricmp。

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

然后你可以一直使用stricmp。

答案 3 :(得分:-1)

如果需要,很容易制作自己的......

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;
}

答案 4 :(得分:-1)

如果您拥有Boost,请在boost::algorithm::iequals(s1, s2, std::locale::classic())中使用<boost/algorithm/string/predicate.hpp>(或者,如果您希望对语言环境敏感,请不要使用语言环境)。它适用于C字符串,std::[w]stringvector<char>等。