Многие из безопасных функций Microsoft, включая fopen_s (), являются частью C11, поэтому теперь они должны быть переносимы. Вы должны понимать, что функции безопасности отличаются поведением исключений, а иногда и возвращаемыми значениями. Кроме того, вы должны знать, что хотя эти функции стандартизированы, это необязательная часть стандарта (Приложение K), которую, по крайней мере, glibc (по умолчанию в Linux) и libc FreeBSD не поддерживают.
Однако я боролся с этой проблемой в течение нескольких лет. Я разместил здесь более крупный набор макросов преобразования . . Для вашей непосредственной проблемы поместите следующий код во включаемый файл и включите его в исходный код:
#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
Конечно, этот подход не реализует ожидаемое поведение исключения.