2010-07-23 6 views
14

Biz hataları yazdırmak için CC++ alternatif()

perror() 

kullanabilirsiniz biliyorum perror için. Sadece bir C++ alternatifi var mı diye merak ettim ya da bu programı (ve dolayısıyla stdio.h) programıma dahil etmem gerekip gerekmediğini merak ediyorum. Mümkün olduğu kadar çok C işlevinden kaçınmaya çalışıyorum.

Teşekkürler! hala gerçekten sadece bir başkası için bir C işlevi yerine koyuyorsun, böylece strerror arayarak biter

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

:

+3

Bilmeyenler için, ancak hemen "sadece" cerr "kelimesini kullananlar için," perror() "ın kullanışlılığı, aslında" errno "sözcüğünü yorumlar ve buna göre görüntüler. Yorumun konsol çıkışı kadar istediğini var sayıyorum ... – KevenK

+0

Hataların nasıl yazdırılacağını açıklamaya çalışabilir misiniz? C-fonksiyonları C++ içinde de vardır, bunları kullanmakta yanlış bir şey yoktur. – Simon

+2

Simon, C++ programlarında C benzeri yazdırma işlevlerinden kaçınmanın nedenlerinden biri, örn. "printf" ve "cout", bkz. http://stackoverflow.com/questions/2708482 –

cevap

19

Sen gibi bir şey yapabilirdi. OTOH, genellikle iyi bir şey olan C ve C++ çıktısını karıştırmak yerine, akışlarla yazmanıza izin verir. En azından AFAIK, C++, strerror (std::string oluşturmaktan başka bir şey) olarak kullanmak için kütüphaneye hiçbir şey eklemez, yine de strerror'dan ne değişeceğinden emin değilim.

+0

Bir "std :: string" döndüren "strerror" A C++ sürümü muhtemelen aynı zamanda thread-safe olurdu, güzel gelişme. –

+0

@Tyler: Eh, bu kesinlikle mümkün ve kullanışlı bir gelişme olurdu. OTOH, "errno" işlevini kullanan herhangi bir iş parçacığı güvenliğini neredeyse kaçınılmaz olarak iş parçacığı yerel deposunu kullanır (yani, 'strerror' iş parçacığının güvenliğini sağlamak için olduğu gibi). –

+0

@Jerry Diğer iş parçacığı çerçeveleri hakkında emin değilim, ancak POSIX iş parçacığı 'errno'nun otomatik olarak iş parçacığı olduğunu garanti eder. 'Strerror' ile ilgili sorun, thread-local olmayan bir statik arabelleğe bir işaretçi döndürmesidir. –

2

boost::system_error::error_code sınıfını kullanabilirsiniz. Zaten boost_system kütüphanesini kullanmıyorsanız

#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; 
} 

o biraz ayrıntılı ve biraz overkill.

+0

Eğer PrintError’u gerçekleştirirseniz, bu oldukça kötü olmaz mıydı? bellek! ", EINVAL); bir bellek ayırma işlemini gerçekleştirmediğinizi keşfettiğinizde? – Simon

+0

Aslında destek kitaplığını kullanamazsınız. Bu, mümkün olduğu kadar 'sade' (daha iyi bir terimin yokluğu için) olmalıdır. Üçüncü taraflara ait herhangi bir şey eklememeye çalışıyorum. Yine de teşekkürler! – Sagar