माइक्रोसॉफ्ट के सुरक्षित कार्यों में से कई fopen_s(), सी 11 का हिस्सा है, इसलिए कर रहे हैं सहित वे अब पोर्टेबल होना चाहिए। आपको महसूस करना चाहिए कि सुरक्षित कार्य अपवाद व्यवहार और कभी-कभी वापसी मूल्यों में भिन्न होते हैं। इसके अतिरिक्त आपको यह पता होना चाहिए कि इन कार्यों को मानकीकृत किया गया है, लेकिन यह वैकल्पिक मानक (अनुलग्नक के) का हिस्सा है जो कम से कम ग्लिब (लिनक्स पर डिफ़ॉल्ट) और फ्रीबीएसडी का libc लागू नहीं होता है।
हालांकि, मैंने कुछ वर्षों से इस समस्या को लड़ा। मैं रूपांतरण मैक्रो here. के अपेक्षाकृत बड़े समूह पोस्ट, अपने तत्काल समस्या के लिए, एक में शामिल फ़ाइल में निम्न कोड डाल दिया, और अपने स्रोत कोड में शामिल हैं:
#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
बेशक इस दृष्टिकोण की उम्मीद अपवाद व्यवहार को लागू नहीं करता है ।
आप शायद इस यद्यपि की तरह कुछ करना चाहिए: _WIN32 #ifdef #define _CRT_SECURE_NO_DEPRECATE #endif # शामिल क्योंकि अन्य प्लेटफार्मों कि संकलन समय के दौरान परिभाषित जरूरत नहीं है। –
markwatson
हां वास्तव में काम किया। –
@markwatson एक बेहतर गार्ड '#ifdef _MSC_VER' जांचना होगा। – MicroVirus