2010-07-23 5 views
14

मैं जानता हूँ कि हम सी मेंसी ++ विकल्प perror करने के लिए()

perror() 

उपयोग कर सकते हैं त्रुटियों मुद्रित करने के लिए। मैं बस सोच रहा था कि इसमें सी ++ विकल्प है या क्या मुझे अपने प्रोग्राम में यह (और इसलिए stdio.h) शामिल करना है या नहीं। मैं जितना संभव हो उतने सी कार्यों से बचने की कोशिश कर रहा हूं।

धन्यवाद!

std::cerr << strerror(errno) << std::endl; 

कि अभी भी, strerror बुला तो तुम सच में सिर्फ एक और के लिए एक सी समारोह प्रतिस्थापन कर रहे हैं समाप्त होता है:

+3

उन लोगों के लिए जो नहीं जानते हैं, लेकिन तत्काल बस "cerr' का उपयोग करें", 'perror()' की उपयोगिता यह है कि यह वास्तव में 'errno' का अर्थ है और तदनुसार इसे प्रदर्शित करता है। मुझे लगता है कि वह सिर्फ कंसोल आउटपुट के रूप में व्याख्या चाहता है ... – KevenK

+0

क्या आप कृपया यह बताने की कोशिश कर सकते हैं कि आप त्रुटियों को कैसे मुद्रित करना चाहते हैं? सी-फ़ंक्शंस को सी ++ में भी शामिल किया गया है, इनका उपयोग करने में कुछ भी गलत नहीं है। – Simon

+2

साइमन, सी ++ प्रोग्रामों में सी-जैसे प्रिंटिंग कार्यों से बचने के कारणों में से एक यह है कि मिश्रण करते समय कुछ देखभाल (फ़्लशिंग) की आवश्यकता होती है। 'printf' और' cout', http://stackoverflow.com/questions/2708482 –

उत्तर

19

आप की तरह कुछ कर सकता है। ओटीओएच, यह आपको सी और सी ++ आउटपुट को मिश्रित करने के बजाय धाराओं के माध्यम से लिखने देता है, जो आम तौर पर एक अच्छी बात है। कम से कम AFAIK, C++ लाइब्रेरी में strerror के लिए एक विकल्प के रूप में कार्य करने के लिए कुछ भी नहीं जोड़ता है (std::string उत्पन्न करने के अलावा, मुझे यकीन नहीं है कि यह strerror से भी बदलेगा)।

+0

'strerror' का एक C++ संस्करण देखें जो 'std :: string' वापस करेगा, संभवतः थ्रेड-सुरक्षित भी होगा, जो एक होगा अच्छा सुधार –

+0

@ टाइलर: ठीक है, यह निश्चित रूप से संभव है, और एक आसान सुधार होगा। ओटीओएच, 'errno' का उपयोग करने वाली किसी भी चीज से थ्रेड सुरक्षा प्राप्त करना लगभग किसी भी तरह से थ्रेड स्थानीय स्टोरेज का उपयोग करता है (यानी, जैसा कि' strerror' थ्रेड सुरक्षित करने के लिए होता है)। –

+0

@ जेरी मैं अन्य थ्रेडिंग ढांचे के बारे में निश्चित नहीं हूं, लेकिन पॉज़िक्स थ्रेड गारंटी देता है कि 'errno' स्वचालित रूप से थ्रेड-लोकल है। 'Strerror' के साथ समस्या यह है कि यह एक स्थिर बफर को पॉइंटर देता है जो थ्रेड-लोकल नहीं है। –

2

आप boost::system_error::error_code कक्षा का उपयोग कर सकते हैं।

#include <boost/system/system_error.hpp> 

#include <cerrno> 
#include <iostream> 

void 
PrintError(
     const std::string& message, 
     int error 
     ) 
{ 
    std::cerr << message << ": " << 
      boost::system::error_code(
       error, 
       boost::system::get_system_category() 
       ).message() 
      << std::endl; 
} 

int 
main() 
{ 
    PrintError("something went wrong!", EINVAL); 
    return 0; 
} 

यह एक बालक वर्बोज़, और कुछ हद तक overkill अगर आप पहले से boost_system पुस्तकालय का उपयोग नहीं कर रहे हैं।

+0

यदि आप PrintError करना चाहते हैं तो यह बहुत बुरा नहीं होगा ("हम भाग गए स्मृति की! ", इनिवाल); जब आप पाते हैं कि आप स्मृति-आवंटन करने में विफल रहे हैं? – Simon

+0

वास्तव में बूस्ट लाइब्रेरी का उपयोग नहीं कर सकता है। इसे यथासंभव 'सादा' (बेहतर अवधि की कमी के लिए) होना चाहिए। किसी तीसरे पक्ष की सामग्री को शामिल न करने का प्रयास कर रहा है। हालांकि धन्यवाद! – Sagar

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