strcmpi umbenannt in _strcmpi?

8

In MSVC ++ gibt es eine Funktion strcmpi für die Groß- / Kleinschreibung C-String Vergleiche.

Wenn Sie es versuchen und benutzen, geht es,

Diese POSIX-Funktion ist ab Visual C ++ 2005 veraltet. Verwenden Sie stattdessen das ISO C ++ - konforme _stricmp.

Was ich nicht sehe ist, warum ISO nicht möchte, dass MSVC ++ strcmpi verwendet, und warum _stricmp der bevorzugte Weg ist, und warum würden sie die Funktion umbenennen, und wie ist eine Funktion, die mit einem Unterstrich ISO-konform beginnt. Ich weiß, dass es einen Grund für all das geben muss, und ich vermute, weil strcmpi nicht Standard ist, und vielleicht möchte ISO, dass nicht-standardmäßige Erweiterungen mit einem _underscore beginnen?

    
bobobobo 27.12.2009, 00:59
quelle

4 Antworten

13

ISO C reserviert bestimmte Bezeichner für zukünftige Erweiterungen (siehe hier ), einschließlich allem, was mit" str "beginnt.

    
Marcelo Cantos 27.12.2009, 01:14
quelle
10

IMNSHO, das ist Microsofts Art zu sagen "Stellen Sie keine Unix-Software auf Windows-Maschinen". Es gibt einige frustrierende Aspekte für das Problem:

  1. strcmpi() ist keine POSIX-Funktion - die relevanten Funktionen sind in <strings.h> definiert und heißen strcasecmp() etc.
  2. Selbst wenn Sie explizit die Unterstützung für POSIX-Funktionen anfordern, denkt Microsoft, dass Sie die POSIX-Namen nicht verwenden dürfen, sondern ihnen den elenden Unterstrich voranstellen müssen.
  3. AFAIK, es gibt keine Möglichkeit, die Sicht des MSVC-Compilers auf das Problem zu überschreiben.

Das heißt, die GCC-Tool-Kette wird ein wenig strippy über einige Funktionen - mktemp() et al. Es kompiliert und verknüpft jedoch erfolgreich trotz der Warnungen (die gerechtfertigt sind).

Ich stelle fest, dass MSVC auch eine Biene in der Haube hat über snprintf() et al. Wenn ihre Funktion dem C99-Standard (zusammen mit dem Rest des Compilers) entspricht, würde niemals ein Risiko eines Überlaufs entstehen - der Standard erfordert, entgegen den Behauptungen von Microsoft, eine Null-Beendigung.

Ich habe keine wirklich gute Lösung für dieses Problem - ich bin mir nicht sicher, dass es eine gibt. Eine Möglichkeit besteht darin, einen Header (oder einen Satz von Headern) zu erstellen, um alle tatsächlichen POSIX-Namen zu Microsofts Fehlinterpretationen von ihnen zuzuordnen. Ein anderes ist zwei erstellen eine Bibliothek von trivialen Funktionen mit dem richtigen Namen POSIX, die jeweils auf die Microsoft-Version des Namens aufrufen (Sie eine massive Sammlung von vierzeiligen Funktionen - die Deklarator-Zeile, eine offene geschweifte Klammer, eine enge geschweifte Klammer und eine return-Anweisung, die die Microsoft-Variante des POSIX-Funktionsnamens aufruft.

Es ist lustig, wie die Microsoft-API-Aufrufe, die auch den Namensraum des Benutzers verschmutzen, nicht veraltet oder umbenannt werden.

    
Jonathan Leffler 27.12.2009 02:19
quelle
3

Namen, die mit einem Unterstrich und einem Kleinbuchstaben beginnen, werden vom C ++ - Standard für die C ++ - Implementierung reserviert, wenn sie im globalen Namensraum deklariert sind. Dies verhindert, dass sie mit ähnlichen Namen in Ihrem eigenen Code kollidieren, der diese Namenskonvention nicht verwenden darf.

    
anon 27.12.2009 01:04
quelle
2

strcmpi läuft in Visual C ++ 2008 insgesamt weg. Sie sollten also unbedingt die Abwertung beachten, wenn Sie jemals ein Upgrade planen.

Das _ macht die Funktion nicht ISO-Standard, es ist nur so, dass Funktionen, die mit _ beginnen, sicherer hinzuzufügen sind, wenn die Sprache sich weiterentwickelt, da dies einer der Teile des für die Sprache reservierten Namensraums ist.

Laut Microsofts Dokumentation für _stricmp klingt das nach strcmpi hat einige Praktiken, die zu einigen nicht intuitiven Ordnungen führen (einschließlich der Normalisierung in Kleinbuchstaben, anstatt die Groß- und Kleinschreibung als irrelevant zu behandeln). Klingt, als ob _stricmp sich mehr Mühe gibt, das zu tun, was man erwarten würde.

    
sblom 27.12.2009 01:16
quelle

Tags und Links