9 votes

strcmpi renommé en _strcmpi ?

Dans MSVC++, il existe une fonction strcmpi pour les comparaisons de chaînes de caractères C insensibles à la casse.

Quand tu essaies de l'utiliser, elle disparaît,

Cette fonction POSIX est dépréciée à partir de Visual C++ 2005. Utilisez la fonction _stricmp conforme à ISO C++ à la place.

Ce que je ne vois pas, c'est pourquoi l'ISO ne veut pas que MSVC++ utilise strcmpi, et pourquoi _stricmp est la méthode préférée, et pourquoi se donnerait-elle la peine de renommer la fonction, et comment une fonction commençant par un trait de soulignement peut-elle être conforme à l'ISO. Je sais qu'il doit y avoir une raison pour tout cela, et je soupçonne que c'est parce que strcmpi n'est pas standard, et peut-être que l'ISO veut que les extensions non standard commencent par un _soulèvement ?

13voto

Marcelo Cantos Points 91211

L'ISO C réserve certains identifiants pour une expansion future (voir ici ), y compris tout ce qui commence par "str".

12voto

Jonathan Leffler Points 299946

À mon avis, c'est la façon dont Microsoft dit "Ne mettez pas de logiciels Unix sur les machines Windows". Il y a plusieurs aspects frustrants à ce problème :

  1. strcmpi() n'est pas une fonction POSIX - les fonctions pertinentes sont définies dans le document <strings.h> et sont appelés strcasecmp() etc.
  2. Même si vous demandez explicitement la prise en charge des fonctions POSIX, Microsoft pense que vous ne pouvez pas utiliser les noms POSIX mais que vous devez les préfixer avec le misérable tiret bas.
  3. A ma connaissance, il n'existe pas de moyen de remplacer le point de vue du compilateur MSVC sur cette question.

Cela dit, la chaîne d'outils GCC est un peu capricieuse à propos de certaines fonctions mktemp() et al. Cependant, il compile et lie avec succès, malgré les avertissements (qui sont justifiés).

Je note que MSVC a également des craintes à propos de snprintf() Si leur fonction était conforme à la norme C99 (ainsi que le reste du compilateur), il n'y aurait jamais de risque de débordement - la norme exige une terminaison nulle, contrairement à ce que prétend Microsoft.

Je n'ai pas de bonne solution à ce problème - je ne suis pas sûr qu'il y en ait une. Une possibilité est de créer un en-tête (ou un ensemble d'en-têtes) pour mettre en correspondance tous les noms POSIX réels avec la mauvaise interprétation qu'en fait Microsoft. Une autre possibilité est de créer une bibliothèque de fonctions triviales avec le nom POSIX correct qui appellent chacune la version Microsoft du nom (ce qui vous donne une collection massive de fonctions de quatre lignes - la ligne du déclarateur, une accolade ouverte, une accolade fermée et une déclaration de retour qui invoque la variante Microsoft du nom de la fonction POSIX.

Il est amusant de constater que les appels API de Microsoft, qui polluent également l'espace de nom de l'utilisateur, ne sont pas dépréciés ou renommés.

3voto

Les noms commençant par un trait de soulignement et une lettre minuscule sont réservés par la norme C++ pour l'implémentation C++, s'ils sont déclarés dans l'espace de noms global. Cela les empêche d'entrer en conflit avec des noms similaires dans votre propre code, qui ne doit pas utiliser cette convention de dénomination.

2voto

sblom Points 15074

strcmpi disparaît complètement dans Visual C++ 2008. Vous devez donc tenir compte de cette dépréciation si vous avez l'intention d'effectuer une mise à niveau.

Le _ ne fait pas de la fonction une norme ISO, c'est juste que les fonctions commençant par _ sont plus sûres à ajouter au fur et à mesure de l'évolution du langage, car c'est l'une des parties de l'espace de noms réservées à l'usage du langage.

Selon La documentation de Microsoft pour _stricmp on dirait que strcmpi a certaines pratiques qui donnent lieu à des classements non intuitifs (y compris la normalisation en minuscules au lieu de simplement traiter la casse comme non pertinente). On dirait que _stricmp prend plus de peine à faire ce que l'on attendrait naturellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X