Nhiều người trong số các chức năng an toàn của Microsoft, bao gồm fopen_s(), là một phần của C11, vì vậy họ nên được di động ngay bây giờ. Bạn nên nhận ra rằng các hàm an toàn khác nhau trong các hành vi ngoại lệ và đôi khi trong các giá trị trả về. Ngoài ra, bạn cần lưu ý rằng mặc dù các chức năng này được chuẩn hóa, đó là một phần tùy chọn tùy chọn của tiêu chuẩn (Phụ lục K) ít nhất glibc (mặc định trên Linux) và libc của FreeBSD không thực hiện.
Tuy nhiên, tôi đã chiến đấu vấn đề này trong một vài năm. Tôi gửi một tập lớn các macro chuyển đổi here., Đối với vấn đề trước mắt của bạn, hãy đặt đoạn mã sau vào một tập tin bao gồm, và bao gồm nó trong mã nguồn của bạn:
#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
Tất nhiên phương pháp này không thực hiện hành vi ngoại lệ dự kiến .
Bạn có lẽ nên làm một cái gì đó giống như mặc dù điều này: #ifdef _WIN32 #define _CRT_SECURE_NO_DEPRECATE #endif #include Bởi vì các nền tảng khác không cần điều đó được xác định trong thời gian biên dịch. –
markwatson
Có thực sự làm việc. –
@markwatson Bảo vệ tốt hơn là kiểm tra '#ifdef _MSC_VER'. – MicroVirus