請注意,如果您創建了一個類,您可以根據需要構建任意數量的類型的消息,這意味着您可以與運算符或printf(3C)中的格式具有類似的效果。事情是這樣的:
// make sure log remains copyable
class log
{
public:
log(const char *function, const char *filename, int line)
{
f_message << function << ":" << filename << ":" << line << ": ";
}
~log()
{
//printf("%s\n", f_message.str().c_str()); -- printf?!
std::cerr << f_message.str() << std::endl;
}
log& operator() (const char *value)
{
f_message << value;
}
log& operator() (int value)
{
f_message << value;
}
// repeat with all the types you want to support in the base class
// (should be all the basic types at least)
private:
sstream f_message;
};
// start the magic here
log log_error(const char *func, const char *file, int line)
{
log l(func, file, line);
return l;
}
// NOTE: No ';' at the end here!
#define LOG_DEBUG log_error(__func__, __FILE__, __LINE__)
// usage sample:
LOG_DEBUG("found ")(count)(" items");
需要注意的是,你可以聲明< <運營商,而不是()。在這種情況下,結果使用情況如下:
LOG_DEBUG << "found " << count << " items";
取決於您更喜歡使用哪種方式。我喜歡(),因爲它會自動保護你的表情。也就是說,如果你想輸出「算< < 3」,那麼你就必須寫:
LOG_DEBUG << "found " << (count << 3) << " items";
不幸的是,這不允許像'DBG_WHEREAMI(「錯誤代碼%d」,的errorCode)'。它不能工作,或者(至少不能移植),因爲C++沒有(還)有可變宏。 – 2010-07-10 03:22:20
不完全... 我想知道如果我可以在編譯時生成一個包含__func__的字符串,這是運行時常量。 這似乎是不可能的。 – bbb 2010-07-12 09:50:11
@bbb:它是'static const',它在運行時沒有機會被生成。 – 2013-02-02 05:08:07