Frage

Diese MSDN-Artikel Staaten, die getcwd () ist veraltet und dass die kompatibele _getcwd ++ ISO C sollte stattdessen verwendet werden, was die Frage aufwirft: was getcwd () nicht ISO-konform macht

?
War es hilfreich?

Lösung

Funktionen nicht in der Norm festgelegt werden soll durch einen Unterstrich als Hinweis vorangestellt werden, dass sie herstellerspezifische Erweiterungen sind oder zu einem Nicht-ISO-Standard entsprechen. Daher hier die „Compliance“ war für Microsoft einen Unterstrich auf den Namen dieser speziellen Funktion hinzuzufügen, da sie nicht Teil der Norm ISO ist.

Andere Tipps

Es gibt eine darüber. P. J. Plauger Antworten auf diese

  

Ich bin der Typ, der im Jahr 1983 bestand darauf zurück, dass der Raum von   Namen zur Verfügung zu einem C-Programm unterteilt werden in:

     

a) diejenigen, die durch die Umsetzung zum Wohle des Programmierers (wie printf)
    b) diejenigen, die den Programmierer reserviert (wie foo)
    c) diejenigen zur Umsetzung reserviert (wie _unlink)

     

Wir wussten schon damals, dass „die Umsetzung“ war zu monolithisch -   oft mehr als eine Quelle liefert Bits der Implementierung -   aber das war das Beste, was wir zur Zeit tun könnten. Standard C ++   hat Namensraum eingeführt zu helfen, aber sie haben nur erreicht   ein Bruchteil ihrer erklärten Ziele. (Das ist, was passiert, wenn Sie   standardisiert einen Papiertiger.)

     

In diesem speziellen Fall liefert Posix eine Liste der Kategorie (a) Namen   (Wie unlink), dass Sie, wenn bekommen definiert sollte und nur, wenn Sie   umfassen bestimmte Header. Da der C Standard stahl seine Header aus   Unix, die die gleiche Quelle wie für Posix ist, einige dieser Header   historisch überlappen. Dennoch sollten Compiler-Warnungen haben   eine Möglichkeit, ob die unterstützten Umgebung unter Berücksichtigung   ist "reiner" Standard C ++ (a Platonic ideal) oder ein gemischtes C / C ++ / Posix   Umgebung. Der aktuelle Versuch von Microsoft, uns zu helfen Arm   Programmierer nicht, dass zu berücksichtigen. Es besteht auf die Behandlung von   entkoppeln als Kategorie (b) Namen, die kurzsichtig ist.

Nun, GCC nicht POSIX Namen in striktem C-Modus erklären, zumindest (obwohl es immer noch in C ++ Modus):

#include <stdio.h>

int main() {
    &fdopen;
    return 0;
}

Ausgabe mit -std=c99

test.c: In function 'main':
test.c:4: error: 'fdopen' undeclared (first use in this function)

Du musst es sagen ausdrücklich, dass Sie mithilfe von Feature-Test-Makros oder nicht vorbei eine bestimmte Norm in einem gemischten C / Posix arbeiten. Es wird dann auf gnu89 Standard, der eine gemischte Umgebung übernimmt (man feature_test_macros). Offenbar hat MSVC diese Möglichkeit nicht hat.

Wie andere haben bereits darauf hingewiesen, ist getcwd nicht in ISO C ++ enthält, aber ist ein Teil von POSIX / IEEE Std 1003.1.

Microsoft hat beschlossen, einige der am häufigsten verwendeten POSIX-Funktionen in ihrer C-Standardbibliothek (aber Präfix diese Funktionen mit einem Unterstrich, um im wesentlichen entmutigt ihre Nutzung) aufzunehmen.

So fügen Sie auf Dan Olson post: ANSI-C-Konformität Seite auf MSDN

  

Die Namen der Microsoft-spezifische Funktionen und globale Variablen beginnen mit einem Unterstrich. Diese Namen können nur lokal, im Rahmen des Codes außer Kraft gesetzt werden. Zum Beispiel, wenn Sie umfassen Microsoft Laufzeit Header-Dateien, können Sie immer noch lokal überschreiben Sie die Microsoft-spezifische Funktion mit dem Namen _open durch eine lokale Variable mit dem gleichen Namen zu deklarieren. Sie können jedoch nicht diesen Namen für die eigene globale Funktion oder globalen Variable verwendet werden.

Soweit mir bewusst getcwd bin () wird nie Teil der ISO Standard C ++ gewesen. _getcwd () auf jeden Fall nicht, wie Standard-Namen werden nicht mit einem Unterstrich beginnen.

In der Tat, die MSDN-Artikel Links zu einer Seite, die man sagt, dass es in deklariert ist direct.h , die Header-Datei nicht ein Standard-C ++ ist. Der Artikel scheint mir falsch.

Für die Aufzeichnung wurde getcwd() nicht von der ISO als veraltet. Es wurde „veraltet“ von Microsoft. Microsoft umschrieb viele Funktionen C - oft mit ein wenig mehr Sicherheit im Auge (sagen wir, String-Funktionen, die auch einen max_length Parameter nehmen). Sie hatten dann ihre Compiler diese Warnungen ausspucken, die ich falsche betrachten, da keine Standards Gruppe eine der Funktionen als veraltet deklariert veraltet.

Der MSDN-Artikel ist etwas verwirrend, was ein normaler Mensch aus nur einer schnellen Lesung abschließen würde (wenn sie nicht lesen mit einem sehr sorgfältigen Anwalt Auge).

Was ist der MSDN-Artikel sagt, ist: getcwd () ist nicht kompatibel mit dem ISO C ++ Standard. Zur Einhaltung dieser ISO C ++ Standard für die Benennung von Funktionen (das, was getcwd verletzt), Microsoft richtig eine setzen _ auf der Vorderseite der Funktion, so dass die gleiche Funktion _getcwd wird (). Das ist die ISO C ++ konforme Art und Weise die Funktion der Namensgebung, weil getcwd () und _getcwd () ist keine ISO C ++ Standard-Funktion, sondern ist ein Microsoft (Lieferant) spezifische oder Implementierung spezifische Funktion.

Der Artikel gibt nicht an, was für einen C ++ ISO-Standard Aufruf des Arbeitsverzeichnis zu bekommen wäre ... wenn das ist, was die Leute neigen dazu, bei einem schnellen Blick zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top