2017-06-08 7 views
12

मैं जो हैडर तहत C11 standard से strerrorlen_s समारोह के लिए शामिल करने के लिए MSVC 2017 खोजने की कोशिश कर रहा हूँ C11 strerrorlen_s समारोह लापता। मुझे strerror_s के साथ प्राप्त करने के लिए त्रुटि संदेश के लिए स्थान आवंटित करने की आवश्यकता है। कोड निम्नलिखित है:MSVC 2017 के तहत

auto size = strerrorlen_s(errno) + 1; 
char* errorReason = (char*)alloca(size); 
strerror_s(errorReason, size, errno); 
std::ostringstream oss; 
oss << "Cannot open: " << fileName << " Reason: " << errorReason; 
throw std::runtime_error(oss.str()); 

प्रलेखन में निम्नलिखित शब्द हैं:

साथ जैसा कि सभी सीमा-जाँच काम करता है, strerror_s और strerrorlen_s केवल उपलब्ध होने की अगर __STDC_LIB_EXT1__ द्वारा परिभाषित किया गया है की गारंटी है कार्यान्वयन और यदि उपयोगकर्ता string.h समेत पूर्णांक स्थिर 1 पर __STDC_WANT_LIB_EXT1__ परिभाषित करता है।

MSVC 2017__STDC_LIB_EXT1__ परिभाषित नहीं करता है और यह है कि string.h सहित प्रभाव नहीं पड़ता से पहले __STDC_WANT_LIB_EXT1__ को परिभाषित करने लगता है। हालांकि strerror_s उपलब्ध है।

  • विंडोज तहत strerrorlen_s उपलब्ध है MSVC 2017 साथ?
  • क्या यह फ़ंक्शन उपलब्ध नहीं होने पर त्रुटि संदेश की लंबाई प्राप्त करने का कोई अन्य तरीका संभव है?
  • , विंडोज तहत strerror_s धागा सुरक्षित है क्योंकि ऐसा लगता है कि लिनक्स के तहत यह अगर वहाँ धागा सुरक्षा के लिए की जरूरत नहीं है और strerror_r इस्तेमाल किया जाना चाहिए है, लेकिन यह विंडोज पर उपलब्ध नहीं है?
+0

क्या आपके लिए 'गेटलाइन()' गायब है? – Badda

+0

@ बड्डा नो 'गेटलाइन' उपलब्ध है। – bobeff

+0

@Aconcagua 'RSIZE_MAX' मैक्रो का मान' 2147483647' है। त्रुटि संदेश के लिए ऐसी स्मृति आवंटित करना बेहद अनैतिक है। :) – bobeff

उत्तर

12

माइक्रोसॉफ्ट विजुअल स्टूडियो, जब सी कंपाइलर के रूप में उपयोग किया जाता है, ज्यादातर सी मानक के 1 99 0 संस्करण का पालन करता है। कुछ प्रयासों को हाल ही में भाषा के 1 999 संस्करण में अपडेट करने के लिए बनाया गया है। वे अभी भी इसके पीछे हैं - संकलक 2011 संस्करण के पास कहीं भी नहीं है। यदि आपको मानक अनुपालन सी कंपाइलर की आवश्यकता है तो आप वीएस का उपयोग नहीं कर सकते हैं।

इसके अतिरिक्त, आप सी ++ मोड में कंपाइलर का उपयोग करने लगते हैं जो सी मानक अनुपालन में बिल्कुल मदद नहीं कर रहा है ... सी 11 और सी ++ 11 हमेशा संगत नहीं होते हैं।

कहा जा रहा है कि आप जिस फ़ंक्शन के लिए पूछते हैं वह वैकल्पिक सीमा-जांच इंटरफ़ेस का हिस्सा है, जिसे मैं बहुत कम मानता हूं, अगर कोई है, तो कंपाइलर अभी तक लागू किए गए हैं। सीमा-जांच इंटरफ़ेस में मौजूद कुछ फ़ंक्शन वीएस पूर्व सी 11 में गैर-मानक एक्सटेंशन के रूप में मौजूद थे। वे जरूरी मानक अनुपालन नहीं कर रहे हैं।

कोई गारंटी नहीं है कि लाइब्रेरी फ़ंक्शन पुन: प्रवेशकर्ता हैं। वे थ्रेड-सुरक्षित हो सकते हैं या नहीं भी हो सकते हैं।

+0

विंडोज़ (मिनीजीडब्ल्यू) के तहत जीसीसी इन कार्यों का समर्थन करने के लिए प्रतीत नहीं होता है। – Aconcagua

+1

@ लंदन क्या आप जानते हैं कि 'strerrorlen_s' फ़ंक्शन उपलब्ध नहीं होने के बाद 'C++' में त्रुटि संदेश के अधिकतम आकार का अनुमान लगाना संभव है या नहीं? – bobeff

संबंधित मुद्दे