Pregunta

En Visual Studio 2005 compilador de C++ , Me sale la siguiente advertencia cuando mi código utiliza el fopen y este tipo de llamadas.

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.'

¿Cómo puedo evitar esto?

¿Fue útil?

Solución

Parece que Microsoft ha dejado de utilizar muchas de las llamadas que el uso de búferes para mejorar la seguridad en el código.Sin embargo, las soluciones que te ofrecen no son portátiles.De todos modos, si usted no está interesado en el uso de la versión segura de sus llamadas (como fopen_s), es necesario hacer una definición de _CRT_SECURE_NO_DEPRECATE antes de su incluidos los archivos de cabecera.Por ejemplo:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

La directiva de preprocesador también puede ser añadido a la configuración del proyecto a efecto de que en todos los archivos en el proyecto.Para ello añadir _CRT_SECURE_NO_DEPRECATE a Propiedades Del Proyecto -> Propiedades De Configuración -> C/C++ -> Preprocesador -> Definiciones Del Preprocesador.

Otros consejos

Así, se podría agregar un:

#pragma warning (disable : 4996)

antes de usar fopen, sin embargo, han considerado el uso de fopen_s como la advertencia sugiere?Devuelve un código de error que le permite comprobar el resultado de la llamada a la función.

El problema con sólo desactivar obsoleto función de las advertencias es que Microsoft puede eliminar la función en cuestión en una versión posterior de la CRT, rompiendo el código (como se indica más abajo en los comentarios, esto no sucede en este caso con fopen, porque es parte de la C & C++ normas ISO).

Esto es sólo Microsoft siendo descarado."Obsoleta" implica una característica del lenguaje que no puede ser proporcionada en futuras versiones de la lengua estándar / estándar de las bibliotecas, como fue decretado por el comité de normas.No, o no debe decir, "nosotros, de forma unilateral, no creo que se debería usar", no importa lo bien fundado de que el asesoramiento es.

Si el código está diseñado para un sistema operativo diferente (como Mac OS X, Linux) puede utilizar el siguiente:

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif

Considere el uso de una portabilidad de la biblioteca como glib o el apache portable runtime.Estos suelen proporcionar seguro, portátil alternativas a las llamadas de estos.Es una buena cosa, porque estas insegura de llamadas están en desuso en la mayoría de los ambientes modernos.

Soy utilizando VisualStdio de 2008.En este caso, a menudo me puse a Preprocessor Definitions

Menú \ Proyecto \ [Nombre De Proyecto] Propiedades...Alt+F7

Si haga clic en este menú o presione Alt + F7 en la ventana de proyecto, se puede ver "Páginas De Propiedades" de la ventana.

A continuación, ver el menú a la izquierda de la ventana.

Configuración De Propiedades \ C/C++ \ Preprocesador

A continuación, agregue _CRT_SECURE_NO_WARNINGS a \ Definiciones Del Preprocesador.

Si quieres ser utilizado en muchas plataformas, usted podría como se ha comentado utilizar define como:

#if defined(_MSC_VER) || defined(WIN32)  || defined(_WIN32) || defined(__WIN32__) \
                        || defined(WIN64)    || defined(_WIN64) || defined(__WIN64__) 

        errno_t err = fopen_s(&stream,name, "w");

#endif

#if defined(unix)        || defined(__unix)      || defined(__unix__) \
                        || defined(linux)       || defined(__linux)     || defined(__linux__) \
                        || defined(sun)         || defined(__sun) \
                        || defined(BSD)         || defined(__OpenBSD__) || defined(__NetBSD__) \
                        || defined(__FreeBSD__) || defined __DragonFly__ \
                        || defined(sgi)         || defined(__sgi) \
                        || defined(__MACOSX__)  || defined(__APPLE__) \
                        || defined(__CYGWIN__) 

        stream = fopen(name, "w");

#endif

Para aquellos que están usando Visual Studio 2017 versión, parece que la definición de preprocesador necesarios para ejecutar operaciones inseguras ha cambiado.Utilizar en su lugar:

#define _CRT_SECURE_NO_WARNINGS

Se va a compilar, a continuación,.

Muchos de seguro de Microsoft funciones, incluyendo fopen_s(), son parte de C11, por lo que debe ser portátil ahora.Usted debe darse cuenta de que el seguro de las funciones difieren en excepción de los comportamientos y a veces en los valores de retorno.Además, usted necesita estar consciente de que mientras estas funciones están estandarizados, es un opcional parte de la norma (Anexo K) que en menos de glibc (por defecto en Linux) y FreeBSD libc no implementan.

Sin embargo, he luchado este problema por un par de años.He publicado una serie de macros de conversión aquí., Para su problema inmediato, coloque el código siguiente en un archivo de inclusión, y la incluyen en su código fuente:

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

Por supuesto, este enfoque no implementar el esperado comportamiento de excepción.

Yo también tengo el mismo problema.Cuando intento agregar la biblioteca opencv

#include <opencv\cv.h>

Yo no tengo una advertencia, sino un error.

error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    c:\program files (x86)\opencv\build\include\opencv2\flann\logger.h  

También he utilizado las directivas de preprocesador como se ha mencionado.Pero que no se resuelve el problema.

Lo resuelto por hacer de la siguiente manera:

  • Ir a Propiedades -> C/C++ -> Encabezados Precompilados -> Elegir No Utilizar Encabezados Precompilados en el Encabezado Precompilado.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top