Domanda

Questo articolo di MSDN afferma che getcwd () è stato deprecato e che invece dovrebbe essere usato _getcwd compatibile con ISO C ++, il che solleva la domanda: cosa rende getcwd () non conforme ISO?

È stato utile?

Soluzione

Le funzioni non specificate nello standard dovrebbero essere precedute da un carattere di sottolineatura per indicare che sono estensioni specifiche del fornitore o aderiscono a uno standard non ISO. Pertanto la "conformità" qui è stato per Microsoft aggiungere un carattere di sottolineatura al nome di questa funzione specifica poiché non fa parte dello standard ISO.

Altri suggerimenti

C'è una una buona discussione a tale proposito. P.J. Plauger risponde a questo

  

Sono il ragazzo che ha insistito nel 1983 che lo spazio di   i nomi disponibili per un programma C devono essere partizionati in:

     

a) quelli definiti dall'implementazione a beneficio del programmatore (come printf)
    b) quelli riservati al programmatore (come foo)
    c) quelli riservati all'implementazione (come _unlink)

     

Già allora sapevamo che "l'implementazione" era troppo monolitico -   spesso più di una fonte fornisce parti dell'implementazione -   ma quello era il meglio che potevamo fare al momento. C ++ standard   ha introdotto spazi dei nomi per aiutare, ma hanno raggiunto solo   una frazione dei loro obiettivi dichiarati. (È quello che succede quando tu   standardizzare una tigre di carta.)

     

In questo caso particolare, Posix fornisce un elenco di nomi di categoria (a)   (come scollegare) che dovresti definire quando e solo quando   includere alcune intestazioni. Dal momento che lo standard C ha rubato le sue intestazioni   Unix, che è la stessa fonte di Posix, alcune di quelle intestazioni   si sovrappongono storicamente. Tuttavia, gli avvisi del compilatore dovrebbero avere   un modo di prendere in considerazione se l'ambiente supportato   è "puro" C ++ standard (ideale Platonico) o C / C ++ / Posix misto   ambiente. L'attuale tentativo di Microsoft di aiutarci poveri   i programmatori non riescono a tenerne conto. Insiste sul trattamento   scollegare come nome di categoria (b), che è miope.

Beh, GCC non dichiarerà i nomi POSIX in modalità C rigorosa, almeno (comunque, lo fa ancora in modalità C ++):

#include <stdio.h>

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

Output utilizzando -std=c99

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

Dovrai dire esplicitamente che stai operando in un C / Posix misto usando le macro di test di funzionalità o non superando uno standard specifico. Verrà quindi predefinito gnu89 che presuppone un ambiente misto ( man feature_test_macros ). Apparentemente, MSVC non ha questa possibilità.

Come altri hanno già sottolineato, getcwd non è incluso in ISO C ++, ma fa parte di POSIX / IEEE Std 1003.1.

Microsoft ha deciso di includere alcune delle funzioni POSIX più comunemente usate nella loro libreria C standard (ma prefisso queste funzioni con un carattere di sottolineatura per scoraggiarne essenzialmente l'uso).

Per aggiungere al post di Dan Olson: vedi ANSI C Compliance pagina su MSDN

  

I nomi delle funzioni specifiche di Microsoft e le variabili globali iniziano con un singolo trattino basso. Questi nomi possono essere sovrascritti solo localmente, nell'ambito del tuo codice. Ad esempio, quando si includono file di intestazione di runtime di Microsoft, è ancora possibile sostituire localmente la funzione specifica di Microsoft denominata _open dichiarando una variabile locale con lo stesso nome. Tuttavia, non è possibile utilizzare questo nome per la propria funzione globale o variabile globale.

Per quanto ne so, getcwd () non ha mai fatto parte dello standard ISO C ++. _getcwd () sicuramente non lo è, poiché i nomi standard non inizieranno con un trattino basso.

In effetti, l'articolo MSDN si collega a una pagina man che dice che è dichiarata in direct.h , che non è un file di intestazione C ++ standard. L'articolo mi sembra fasullo.

Per la cronaca, getcwd () non è stato deprecato da ISO. Era "deprecato" da Microsoft. Microsoft ha riscritto molte funzioni C, spesso tenendo presente un po 'di sicurezza (diciamo, funzioni stringa che accettano anche un parametro max_length ). Quindi hanno fatto in modo che il loro compilatore sputasse questi avvertimenti, che ritengo fasulli perché nessun gruppo di standard ha deprecato nessuna delle funzioni dichiarate deprecate.

L'articolo MSDN è alquanto confuso in ciò che una persona normale concluderebbe con una semplice lettura (se non lo leggono con un occhio molto attento da avvocato).

Ciò che dice l'articolo MSDN è: getcwd () non è conforme allo standard ISO C ++. Per conformarsi a quello standard ISO C ++ per la denominazione delle funzioni (che è ciò che getcwd viola), Microsoft posiziona correttamente un _ sul fronte della funzione, quindi la stessa funzione diventa _getcwd (). Questo è il modo conforme a ISO C ++ di denominare la funzione perché getcwd () e _getcwd () non sono una funzione standard ISO C ++, ma sono una funzione specifica di Microsoft (fornitore) o specifica dell'implementazione.

L'articolo non indica quale sarebbe una chiamata standard C ++ ISO per ottenere la directory di lavoro ... anche se questo è ciò che la gente tende a leggere a colpo d'occhio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top