在预处理器宏中附加到 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))