À 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 :
-
strcmpi()
n'est pas une fonction POSIX - les fonctions pertinentes sont définies dans le document <strings.h>
et sont appelés strcasecmp()
etc.
- 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.
- 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.