Подтвердить что ты не робот

G++ error: 'stricmp не был объявлен в этой области (но ОК для' strcmp ')

Я пытаюсь скомпилировать следующий очень простой фрагмент исходного кода:

#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(), тогда все в порядке!

Что здесь может быть неправильным? Должна ли разрешаться функция stricmp() при разрешении strcmp()?

Sureley, все это можно было бы написать гораздо лучше, не используя strcmp/stricmp.

Но это не главное.

Я переношу часть программного обеспечения, которое широко использует вызовы stricmp(). И если возможно, я хотел бы избежать всех усилий, необходимых для изменения каждого вызова stricmp.

Любая помощь по этому поводу будет очень оценена!

BTW: Я использую кармическую ОС Ubuntu (v9.10) с g++ v4.4.1.

Кстати: как вы можете видеть, я также провел несколько испытаний с "#include string.h" или с "namespace std", но ничего не помогло.

4b9b3361

Ответ 2

stricmp не является ни POSIX, ни ANSI, поэтому не имеет значения, разрешено ли strcmp, если ваш компилятор или стандартный библиотека строго придерживается стандартных функций библиотеки POSIX или ANSI (как это, вероятно, имеет место с пакетом GCC).

Ответ 3

Добавьте определение для его перезаписи stricmp с помощью strcasecmp на тех платформах, которые вы ищете.

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

Тогда вы можете просто использовать stricmp всегда.

Ответ 4

Довольно легко сделать свой собственный, если потребуется...

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