在预处理器宏中附加到 ostream
Append to ostream in a preprocessor macro
我会用自定义定义来模仿广泛使用的 BOOST_LOG_TRIVIAL
,而自定义定义使用 std::cout
。
// 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 trivial logging 添加的漂亮的尾随换行符。
我读过一些提升 headers,但实际上并不知道正确的预处理器语法来维护数百个 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))
我会用自定义定义来模仿广泛使用的 BOOST_LOG_TRIVIAL
,而自定义定义使用 std::cout
。
// 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 trivial logging 添加的漂亮的尾随换行符。
我读过一些提升 headers,但实际上并不知道正确的预处理器语法来维护数百个 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))