2009-03-06 9 views
6

Ho appena cambiato il mio IDE in MS Visual Studio 2005 proveniente da MSVC++ 6 e ho ricevuto molti avvisi di deprecazione. Invece di ignorare l'avviso, ho iniziato a cambiarli con gli equivalenti. Tuttavia, ho poi scoperto che si trattava di implementazioni solo Microsoft.Le funzioni Microsoft _s, fanno ora parte dello standard C++?

Ho letto da qualche parte che stavano spingendo affinché questi diventassero parte dello standard. È?

È consigliabile utilizzare queste funzioni _s? O dovrei usare qualcos'altro?

Grazie.

+2

Sì.Poiché Microsoft si è coperta di gloria con la debacle degli standard OOXML, sono sicuro che ISO sta cadendo su se stesso per incorporare tutte le loro cose nello standard C++ :-) – paxdiablo

+0

Non posso dire se questo è sarcasmo o no. :( – krebstar

+0

Più umorismo che sarcasmo Scuse Mia moglie sarebbe d'accordo con te che il mio senso dell'umorismo a volte è strano – paxdiablo

risposta

12

Le funzioni *_s() non fanno parte dello standard C, ma è in corso una "Relazione tecnica" in attesa di essere aggiunte (non sono sicuro che le routine nel TR siano esattamente le stesse di Microsoft o se siano Sono solo simili).

TR 24.731-1: estensioni per la libreria C Parte I: interfacce Bounds-checking:

Se si desidera continuare ad utilizzare le vecchie funzioni è possibile mantenere la deprecazione avvisi silenziosi definendo la macro _CRT_SECURE_NO_WARNINGS (era _CRT_SECURE_NO_DEPRECATE che potrebbe essere ancora supportata).

+0

Solo per supportare, _CRT_SECURE_NO_DEPRECATE funziona su alcuni come strncpy, ecc, mentre per altri come fopen() è necessario #pragma warning (disable: 4996). Presumibilmente si potrebbe semplicemente definire _CRT_SECURE_NO_WARNINGS ma non ha funzionato per me .. – krebstar

+0

Queste funzioni '_s' sono ora parte di C1X Annex K. – kennytm

+0

E sono sicuramente un miglioramento dell'interfaccia MS, che è quindi non conforme. Sebbene non sia un gran miglioramento, e l'utilità è molto discussa. – Deduplicator

1

Hai aggiornato l'IDE e aggiornato anche le tue librerie Microsoft. Francamente puoi continuare a utilizzare le tue vecchie librerie mentre continuano a essere mantenute (per compatibilità con le versioni precedenti) sebbene Microsoft abbia affermato che inizieranno effettivamente a eliminare alcune di queste vecchie funzioni. Direi che se stai sviluppando in avanti puoi utilizzare le nuove funzioni; se stai sviluppando al contrario (o non preoccuparti di quale sia la versione), potresti voler utilizzare le funzioni meno recenti.

+0

Grazie, forse userò semplicemente la macro _CRT_SECURE_NO_WARNINGS .. – krebstar

1

Se si sta prendendo di mira la piattaforma Microsoft, con tutti i mezzi li usa. Anche se non lo sei, puoi sempre implementarli da solo quando (o se) hai bisogno di trasferire il tuo software su una piattaforma non Microsoft.

Il caso peggiore è che si finisce per utilizzare alcuni #ifdef per compilare in modo condizionale.

1

Sono stati presi in considerazione per la standardizzazione, per quanto ne so io. La proposta è TR 24731.

Se è una buona idea usarli, direi di sì. Non mi piace molto il modo in cui catturano gli errori, ma credo che tu possa fornire loro il tuo stesso gestore. Se hai bisogno di compatibilità multipiattaforma hai due scelte: implementale con macro sulle piattaforme non Windows o disattiva gli avvisi di deprecazione.

Dopo aver eseguito una revisione tramite una base di codice estesa ho determinato che è quasi impossibile far sì che tutti i programmatori utilizzino correttamente le funzioni della libreria C standard per la manipolazione delle stringhe, quindi tutto ciò che mira a correggere è un'aggiunta gradita.

+4

Il problema è che MS ha fatto il passo per introdurre unilateralmente le funzioni come se fossero uno standard e "deprecando" le funzioni "C" che erano nello standard contemporaneamente. Mi sembra ancora un altro modo per costringerti a stare con i loro strumenti. –

+0

Questo è eccessivamente scettico. Hanno apportato un piccolo miglioramento interno alle funzioni della libreria C standard e lo hanno inserito nelle loro versioni pubbliche, oltre a inviarlo per la standardizzazione. Se si trattava di uno stratagemma intenzionale per aumentare la propria quota di mercato, perché provare a standardizzarlo? –

1

È necessario utilizzare le funzioni standard e disattivare qualsiasi avviso sadico che Microsoft abbia attivato per impostazione predefinita per scoraggiarvi dalla scrittura di codice conforme allo standard. Dubito seriamente che le "funzioni _s" saranno mai aggiunte allo standard C (sebbene siano state proposte) poiché sono un'invenzione di un singolo fornitore e non sono mai state implementate da nessun altro fornitore. (Ehi, incorporiamo tutto il POSIX nello standard C mentre ci siamo ...)

Problemi correlati