[英]Append to ostream in a preprocessor macro
我會用使用std::cout
的自定義定義來模仿廣泛使用的BOOST_LOG_TRIVIAL
。
// Building with
// g++ -std=c++14 -Wall -pedantic -g -O0 -DBOOST_LOG_DYN_LINK -c log.cpp
// g++ log.o -lpthread -lboost_log -lboost_log_setup -lboost_system -lboost_thread -o bl
#define FORBID_BOOST_LOG
#define VALUE_TO_STRING(x) #x
#ifdef FORBID_BOOST_LOG
#include <iostream>
#define LOG(sev) std::cout << "[" << VALUE_TO_STRING(sev) << "] "
#else
#include <boost/log/trivial.hpp>
#define LOG(sev) BOOST_LOG_TRIVIAL(sev)
#endif
int main()
{
LOG(info) << "hello logging";
}
這很好,但是這里唯一缺少的功能是通過 boost 瑣碎日志記錄添加的漂亮的尾隨換行符。
我讀過幾個 boost 頭文件,但實際上不知道正確的預處理器語法來維護數百個與預處理器選擇的實現無關的LOG(sev)
調用。
一種解決方案是創建一個日志對象,在銷毀時打印換行符。 該對象將在日志表達式的末尾被銷毀,因此您將在日志消息的末尾獲得一個新行(這可能也是 boost log 的工作方式):
#include <iostream>
struct Log
{
Log(const char* sev)
{
std::cout << "[" << VALUE_TO_STRING(sev) << "] ";
}
~Log()
{
std::cout << "\n";
}
template < typename T >
Log& operator <<(const T& value)
{
std::cout << value;
return *this;
}
};
#define LOG(sev) Log(VALUE_TO_STRING(sev))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.