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
当然,这种方法并没有实现预期的异常行为。