2015-10-25 3 views
7

Su this page, Microsoft dichiara che POSIX mkdir è obsoleto a favore del "Conforme ISO C++" _mkdir. Lo stesso sembra applicarsi ad altre funzioni POSIX simili.Win32 mkdir vs _mkdir

Significano deprecati nella misura in cui sono interessati oppure esiste un corpo standard (POSIX, ISO?) Che lo ha deprecato?

In che senso è più conforme ISO C++ e rispetto a quale standard ISO è più conforme?

Purtroppo non ho accesso agli attuali standard ISO C++, anche se ho guardato l'ultima bozza disponibile gratuitamente per C++ 11 (N3337) e non ho menzionato queste funzioni che ho potuto vedere.

La ragione per cui mi chiedo è che io chiamo spesso queste funzioni POSIX, tuttavia preferirei non scrivere codice contro standard deprecati.

+0

la risposta in questa discussione potrebbe aiutare: http://stackoverflow.com/questions/814975/getch -è-deprecato – object

+0

hai pensato a questo: ISO/IEC 14882: 2011 (E)? – HDJEMAI

+5

'mkdir' non fa parte dello standard ISO e secondo lo standard ISO tutte le funzioni non standard fornite dalla libreria di runtime devono iniziare con un trattino basso. Di conseguenza, Microsoft ha aggiunto il carattere di sottolineatura a tutte le funzioni simili a POSIX (e altre funzioni non standard) nella libreria di runtime. Non c'è davvero niente di più - solo i vecchi nomi delle funzioni sono deprecati, non le stesse funzioni, e si applica solo a Visual Studio, non a POSIX. –

risposta

5

Solo il vecchio nome è deprecato, non la funzione e solo in Visual Studio, non in POSIX.

In pratica, il motivo è che mkdir non è definito come una funzione di libreria di runtime nello standard ISO C++ e che le funzioni di libreria di runtime non standard iniziano con un trattino di sottolineatura. Di conseguenza, Microsoft ha aggiunto il carattere di sottolineatura a tutti i nomi di funzioni non standard nella libreria di runtime. Molte di queste sono funzioni simili a POSIX, sebbene ce ne siano alcune specifiche per Windows.

La sezione dello standard che definisce gli identificatori che sono riservati per l'utilizzo da parte l'implementazione è 2.10, paragrafo 3. Per quanto ne so, la norma non esplicitamente stato che l'attuazione non è possibile utilizzare altri identificatori, ma presumibilmente è implicito nel fatto che una tale implementazione non sarebbe in grado di costruire un programma C++ legale che capita di usare lo stesso nome in modo incompatibile.

In questo caso particolare, ciò è vero solo se il programma include i relativi intestazioni definito dall'implementazione, quindi non sono convinto che ISO C++ ha infatti richiedono Visual Studio deprecare i vecchi nomi, ma sembra che Microsoft credeva che lo fosse, o che l'uso di identificatori riservati fosse la migliore pratica. (O che essere in grado di compilare fonte POSIX-si dovrebbe essere scoraggiato; scegliete voi!)

Nota aggiuntiva: vorrei presumere che è anche possibile che un conflitto di denominazione a causare problemi durante il collegamento per più complicato programmi, anche quando le intestazioni definite dall'implementazione non sono incluse. Tuttavia, non è chiaro che la deprecazione delle funzioni aiuti effettivamente in questo caso, poiché i vecchi nomi sono ancora presenti nella libreria. (Essi sono, tuttavia, in un file LIB diversa, e forse per questo migliora le cose in qualche modo.)

You can download the November 2014 working draft of the current ISO C++ standard here.