Disabilitazione degli avvisi generati tramite _CRT_SECURE_NO_DEPRECATE
-
02-07-2019 - |
Domanda
Qual è il modo migliore per disabilitare gli avvisi generati tramite _CRT_SECURE_NO_DEPRECATE
che consente di ripristinarli con facilità e funzioneranno su tutte le versioni di Visual Studio?
Soluzione
Se non vuoi inquinare il tuo codice sorgente (dopo che tutto questo avviso è presente solo con il compilatore Microsoft), aggiungi il simbolo _CRT_SECURE_NO_WARNINGS
alle impostazioni del tuo progetto tramite " Progetto " - > " Proprietà " - > " Proprietà di configurazione " - > " C / C ++ " - > " Preprocessore " - > " Definizioni del preprocessore " ;.
Inoltre è possibile definirlo appena prima di includere un file di intestazione che genera questo avviso. Dovresti aggiungere qualcosa del genere
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
E solo una piccola osservazione, assicurati di capire a cosa serve questo avviso e forse, se non intendi utilizzare altri compilatori diversi da MSVC, potresti utilizzare una versione più sicura delle funzioni, ad esempio strcpy_s invece di strcpy.
Altri suggerimenti
È possibile disabilitare temporaneamente gli avvisi nei punti in cui vengono visualizzati utilizzando
#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
in modo da non disabilitare tutti gli avvisi, che a volte possono essere dannosi.
Lavoro su un progetto multipiattaforma, quindi non posso usare la funzione _s e non voglio inquinare il mio codice con codice specifico di Visual Studio.
la mia soluzione è disabilitare l'avviso 4996 sul progetto Visual Studio. vai a Progetto - > Proprietà - > Proprietà di configurazione - > C / C ++ - > Avanzato - > Disabilitare l'avviso specifico aggiungere il valore 4996.
se usi anche la libreria mfc e / o atl (non il mio caso), definisci prima di includere mfc _AFX_SECURE_NO_DEPRECATE e prima includi atl _ATL_SECURE_NO_DEPRECATE.
utilizzo questa soluzione in Visual Studio 2003 e 2005.
P.S. se usi solo Visual Studio, i sovraccarichi di template sicuri potrebbero essere una buona soluzione.
Puoi anche utilizzare Sovraccarichi di template sicuri , ti aiuteranno a sostituire le chiamate non sicure con chiamate sicure ovunque sia possibile dedurre facilmente le dimensioni del buffer (array statici).
Aggiungi semplicemente quanto segue:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
Quindi correggi manualmente gli avvisi rimanenti, usando le funzioni _s.
Combinazione di @ [macbirdie] e @ [Adrian Borchardt]. Il che si rivela molto utile nell'ambiente di produzione (non confondere gli avvisi precedentemente esistenti, specialmente durante la compilazione multipiattaforma)
#if (_MSC_VER >= 1400) // Check MSC version
#pragma warning(push)
#pragma warning(disable: 4996) // Disable deprecation
#endif
//... // ...
strcat(base, cat); // Sample depreciated code
//... // ...
#if (_MSC_VER >= 1400) // Check MSC version
#pragma warning(pop) // Renable previous depreciations
#endif
Per l'avvertimento per caso di avvertimento, è consigliabile ripristinarlo al valore predefinito a un certo punto, poiché lo si sta facendo caso per caso.
#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
Il modo migliore per farlo è con un semplice controllo e valutazione. Di solito faccio qualcosa del genere:
#ifndef _DEPRECATION_DISABLE /* One time only */
#define _DEPRECATION_DISABLE /* Disable deprecation true */
#if (_MSC_VER >= 1400) /* Check version */
#pragma warning(disable: 4996) /* Disable deprecation */
#endif /* #if defined(NMEA_WIN) && (_MSC_VER >= 1400) */
#endif /* #ifndef _DEPRECATION_DISABLE */
Tutto ciò che è veramente richiesto è il seguente:
#pragma warning(disable: 4996)
Non mi ha ancora deluso; Spero che questo aiuti
puoi disabilitare il controllo di sicurezza. vai a
Progetto - > Proprietà - > Proprietà di configurazione - > C / C ++ - > Generazione di codice - > Controllo di sicurezza
e selezionare Disabilita controllo di sicurezza (/ GS-)
Puoi definire il simbolo _CRT_SECURE_NO_WARNINGS per sopprimerli e annullarne la definizione per ripristinarli.
Un'altra risposta tardiva ... Ecco come la usa Microsoft nel suo wchar.h
. Si noti che disabilitano anche Avviso C6386 :
__inline _CRT_INSECURE_DEPRECATE_MEMORY(wmemcpy_s) wchar_t * __CRTDECL
wmemcpy(_Out_opt_cap_(_N) wchar_t *_S1, _In_opt_count_(_N) const wchar_t *_S2, _In_ size_t _N)
{
#pragma warning( push )
#pragma warning( disable : 4996 6386 )
return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
#pragma warning( pop )
}