Muchas de las funciones de seguridad de Microsoft, incluyendo fopen_s(), forman parte de C11, por lo 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, si bien estas funciones están estandarizadas, es una opcional parte 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 unos años. He publicado un conjunto mayor de macros de conversión here., para su problema de inmediato, poner el siguiente código en un archivo de inclusión, e incluirlo 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 excepción esperada .
probablemente debería hacer algo como esto, sin embargo: #ifdef _WIN32 #define _CRT_SECURE_NO_DEPRECATE #endif # include Debido a que otras plataformas no necesitan que se define durante el tiempo de compilación. –
markwatson
Sí que efectivamente funcionó. –
@markwatson Una mejor guardia sería verificar '#ifdef _MSC_VER'. – MicroVirus