g++ erreur: ‘stricmp’ n'a pas été déclarée dans ce cadre (mais OK pour "strcmp')
Je suis en train de compiler le suit de très très simple morceau de code source:
#include <cstring>
//#include <string.h>
//using namespace std;
class Helper {
public:
int cStringsAreEqual(const char *s1, const char *s2) {
return stricmp(s1, s2);
}
};
... mais j'obtiens le message d'erreur suivant:
g++ error: ‘stricmp’ was not declared in this scope
Cependant quand j'utilise strcmp() au lieu de stricmp() alors tout va bien!
Quel est le problème ici? Ne devrait pas stricmp() est autorisé que lorsque strcmp() est-elle autorisée?
Sureley, tout cela pourrait être écrit beaucoup mieux sans utiliser strcmp/stricmp.
Mais ce n'est pas le point ici.
Je suis portage d'un morceau de logiciel qui fait une large part à des appels à stricmp(). Et si possible j'aimerais éviter tous les efforts nécessaires pour changer tous les appels à stricmp.
Toute aide sur ce serait très apprécié!
BTW: j'utilise Ubuntu karmic OS (v9.10) avec g++ v4.4.1.
BTW: comme vous pouvez le voir j'ai aussi fait quelques essais avec " #include string.h' ou avec 'namespace std", mais rien n'a aidé.
- Considérant que stricmp et strcmp ne sont pas les mêmes (ce dernier est sensible à la casse), vous pouvez hésitez avant de les changer de toute façon.
- Je sais qu'ils ne sont pas les mêmes. C'est pourquoi je veux utiliser stricmp et pas strcmp
- Notez également que
<string.h>
et<cstring>
ne sont pas exactement les certains. Ce n'est pas la cause de votre problème, mais vous aurez besoin d'écrirestd::strcmp
(oustd::strcoll
) plutôt que de supposer que les noms sont importés dans l'espace de noms global.
Vous devez vous connecter pour publier un commentaire.
Essayer
strcasecmp()
. Voici la page de manuel pour elle. Il est conforme à 4.4 BSD et POSIX.1-2001.stricmp
n'est ni POSIX ni ANSI, de sorte qu'il n'a pas vraiment d'importance sistrcmp
est autorisée, si votre compilateur ou de la bibliothèque standard est conformant strictement à la norme POSIX ou ANSI standard des fonctions de la bibliothèque (comme c'est probablement le cas avec le CCG suite).Ajouter une définition pour remplacer stricmp avec strcasecmp sur les plates-formes que vous recherchez.
Vous pouvez simplement utiliser stricmp toujours.
Assez facile de faire votre propre en cas de besoin...
s1
sortes plus tards2
? Ou est-il prévu d'avoir une interface différente pourstd::strcmp()
?CAVEAT
: Les appels à::toupper
sont des paramètres régionaux spécifiques. Vous pouvez obtenir des résultats différents selon l'endroit où vous l'exécuter. Pensez à utiliser les paramètres régionaux au courant des remplacements à la place.