Microsoft 的许多安全函数,包括 fopen_s(),都是 C11 的一部分,因此它们现在应该是可移植的。您应该意识到,安全函数的异常行为不同,有时返回值也不同。此外,您需要注意,虽然这些功能是标准化的,但它是至少 glibc(Linux 上的默认设置)和 FreeBSD 的 libc 没有实现的标准(附件 K)的可选部分。
然而,我与这个问题斗争了几年。我在这里发布了一组更大的转换宏。, 对于您的直接问题,请将以下代码放入包含文件中,并将其包含在您的源代码中:
#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
当然,这种方法并没有实现预期的异常行为。