visual-c++ - fopen_s - fopen c++ ejemplo
fopen advertencia obsoleta (10)
Bueno, podrías agregar un:
#pragma warning (disable : 4996)
antes de usar fopen, pero ¿ha considerado usar fopen_s como sugiere la advertencia? Devuelve un código de error que le permite verificar el resultado de la llamada a la función.
El problema con la desactivación de advertencias de funciones obsoletas es que Microsoft puede eliminar la función en cuestión en una versión posterior del CRT, rompiendo su código (como se indica a continuación en los comentarios, esto no sucederá en este caso con fopen porque es parte de los estándares C & C ++ ISO).
En el compilador C ++ de Visual Studio 2005 , recibo la siguiente advertencia cuando mi código usa fopen y esas 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 evito esto?
Considere usar una biblioteca de portabilidad como glib o apache portable runtime . Por lo general, ofrecen alternativas seguras y portátiles para llamadas como estas. También es una buena idea, porque estas llamadas inseguras están en desuso en la mayoría de los entornos modernos.
Esto es solo Microsoft siendo descarado. "Obsoleto" implica una función de idioma que puede no proporcionarse en futuras versiones del lenguaje estándar / bibliotecas estándar, según lo decida el comité de estándares. No significa, o no debería significar, "nosotros, unilateralmente, no creemos que deba usarlo", no importa cuán bien fundado sea ese consejo.
Estoy usando VisualStdio 2008. En este caso, a menudo establezco Preprocessor Definitions
Menú / Proyecto / [Nombre del proyecto] Propiedades ... Alt + F7
Si hace clic en este menú o presiona Alt + F7 en la ventana del proyecto, puede ver la ventana "Páginas de propiedades" .
Luego vea el menú a la izquierda de la ventana.
Propiedades de configuración / C / C ++ / Preprocesador
A continuación, agregue _CRT_SECURE_NO_WARNINGS
a / Preprocessor Definitions .
Muchas de las funciones seguras de Microsoft, incluyendo fopen_s (), son parte de C11, por lo que deberían ser portátiles ahora. Debe tener en cuenta que las funciones de seguridad difieren en comportamientos de excepción y, en ocasiones, en valores de retorno. Además, debe tener en cuenta que, aunque estas funciones están estandarizadas, es una parte opcional del estándar (Anexo K) que al menos glibc (predeterminado en Linux) y la libc de FreeBSD no implementan.
Sin embargo, luché contra este problema durante algunos años. Publiqué un conjunto más grande de macros de conversión here. Para su problema inmediato, coloque el siguiente código en un archivo de inclusión e inclúyalo 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 implementa el comportamiento de excepción esperado.
Para aquellos que están usando la versión Visual Studio 2017, parece que la definición del preprocesador requerida para ejecutar operaciones inseguras ha cambiado. Use en su lugar:
#define _CRT_SECURE_NO_WARNINGS
Se compilará entonces.
Parece que Microsoft ha desaprobado muchas llamadas que usan búferes para mejorar la seguridad del código. Sin embargo, las soluciones que brindan no son portátiles. De todos modos, si no está interesado en utilizar la versión segura de sus llamadas (como fopen_s ), debe colocar una definición de _CRT_SECURE_NO_DEPRECATE antes de los archivos de encabezado incluidos. Por ejemplo:
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
La directiva de preprocesador también se puede agregar a la configuración de su proyecto para efectuarla en todos los archivos del proyecto. Para hacer esto, agregue _CRT_SECURE_NO_DEPRECATE a Project Properties -> Configuration Properties -> C / C ++ -> Preprocessor -> Preprocessor Definitions .
Si desea que se use en muchas plataformas, podría hacer un comentario como: 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
Si su código está destinado a un sistema operativo diferente (como Mac OS X, Linux), puede usar lo siguiente:
#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif
También tengo el mismo problema. Cuando intento agregar la biblioteca de opencv
#include <opencv/cv.h>
No recibí 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 utilicé las directivas del preprocesador como se menciona. Pero eso no resolvió el problema.
Lo resolví haciendo lo siguiente:
- Vaya a Propiedades -> C / C ++ -> Encabezados precompilados -> Elija no usar encabezados precompilados en el encabezado precompilado.