C++ 在预处理器宏中附加到ostream

C++ 在预处理器宏中附加到ostream,c++,logging,boost,c-preprocessor,C++,Logging,Boost,C Preprocessor,我会模仿流行的BOOST\u LOG\u trial,使用一个自定义定义,它使用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_BOOS

我会模仿流行的
BOOST\u LOG\u trial
,使用一个自定义定义,它使用
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";
}
//使用
//g++-std=c++14-Wall-pedantic-g-O0-DBOOST\u LOG\u DYN\u LINK-c LOG.cpp
//g++log.o-lpthread-lboost\u log-lboost\u log\u设置-lboost\u系统-lboost\u线程-o bl
#定义禁止日志
#定义值_到_字符串(x)#x
#ifdef禁止\u增压\u日志
#包括

#definelog(sev)std::cout一种解决方案是创建一个日志对象,在销毁时打印换行符。对象将在日志表达式的末尾被销毁,因此您将在日志消息的末尾得到一行新行(这可能也是boost日志的工作方式):

#包括
结构日志
{
日志(常量字符*sev)
{
标准::cout
#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))