70 votes

avertissement déconseillé fopen

Sur le compilateur Visual Studio 2005 C ++ , je reçois l'avertissement suivant lorsque mon code utilise le fopen et de tels appels.

 1>foo.cpp(5) : warning C4996: 'fopen' was declared deprecated
1>        c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
1>        Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
 

Comment puis-je empêcher cela?

132voto

Ashwin Points 17537

Il ressemble à Microsoft a retiré beaucoup d'appels qui utilisent des tampons pour améliorer la sécurité du code. Cependant, les solutions qu'ils fournissent ne sont pas portables. De toute façon, si vous n'êtes pas intéressés par l'utilisation de la version sécurisée de leurs appels (comme fopen_s), vous devez placer une définition de _CRT_SECURE_NO_DEPRECATE avant votre inclus fichiers d'en-tête. Par exemple:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

La directive de préprocesseur peut également être ajoutés à vos paramètres de projet de l'effet sur tous les fichiers dans le projet. Pour ce faire, ajoutez _CRT_SECURE_NO_DEPRECATE de Propriétés du Projet -> Propriétés de Configuration -> C/C++ -> Préprocesseur -> Définitions de Préprocesseur.

30voto

John Sibly Points 9805

Eh bien, vous pouvez ajouter un:

 #pragma warning (disable : 4996)
 

avant d’utiliser fopen, mais avez-vous déjà envisagé d’utiliser fopen_s comme le suggère l’avertissement? Il renvoie un code d'erreur vous permettant de vérifier le résultat de l'appel de fonction. Le problème avec la désactivation des avertissements de fonctions obsolètes est que Microsoft peut supprimer la fonction en question dans une version ultérieure du tube cathodique, en cassant votre code.

13voto

tragomaskhalos Points 1085

Ceci est juste Microsoft étant effronté. "Obsolète" implique une fonctionnalité de langage qui pourrait ne pas être fournie dans les futures versions des bibliothèques de langages / langages standard, comme l'a décrété le comité des normes. Cela ne signifie pas, ou ne devrait pas signifier, "nous, unilatéralement, nous ne pensons pas que vous devriez l'utiliser", quel que soit le fondement de ce conseil.

9voto

Magnetron Points 89

Si votre code est destiné à différents systèmes d’exploitation (tels que MAC OS X, Linux), vous pouvez utiliser les éléments suivants:

 #ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif
 

6voto

Ashwin Points 17537

@ John Sibly: Merci pour le commentaire informatif. J'aurais pu utiliser fopen_s , mais comme cela est venu avec un code que je voulais être aussi portable que possible, je ne préfère pas cette solution. J'ai du mal à croire que Microsoft supprimera complètement les appels de bibliothèque standard. Ils pourraient les rendre assez difficiles à utiliser, mais ils devront les conserver pour conserver l’ancien code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X