如何抑制由 Boost.Log 和 GCC 4.4 引起的"warning: missing initializer"?

How to suppress "warning: missing initializer" caused by Boost.Log and GCC 4.4?

本文关键字:warning initializer missing 何抑制 Boost Log GCC      更新时间:2023-10-16

谁能告诉我如何抑制由Boost.Log和GCC 4.4.7生成的以下警告消息?我的项目是在 C++11 模式下构建的(在 GCC 4.4.7 中-std=c++0x)。

src/Logger.cc:7: warning: missing initializer for member ‘boost::log::v2_mt_posix::expressions::attribute_keyword<tag::severity, boost::phoenix::actor>::proto_expr_’

其中src/Logger.cc是我的日志记录类的源文件,它是 Boost.Log 的包装器。第 7 行使用 Boost.Log 宏之一,如下所示。 Logger::ESeverityLevelLogger.h 中定义的枚举。

BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", Logger::ESeverityLevel)

可以按如下方式展开此宏。

namespace tag    {
        struct severity :
            public ::boost::log::expressions::keyword_descriptor
        {
            typedef Logger::ESeverityLevel value_type;
            static ::boost::log::attribute_name get_name() { return ::boost::log::attribute_name("Severity"); }
        };
    }
    typedef ::boost::log::expressions::attribute_keyword< tag::severity > severity_type;    const severity_type severity = {};

看起来severity_type的初始化会发出此警告,而它对 Clang 有效(Apple LLVM 版本 6.0)。

此宏的官方示例代码可在以下位置找到http://theboostcpplibraries.com/boost.log#ex.log_05

一种方法是使用GCC的内置#pragma禁用GCC中的警告,例如

#pragma GCC diagnostic push      // Save the current warning state
#pragma GCC diagnostic ignored "-Wmissing-field-initializers" // Disable the warning you're getting
...
// offending code
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", Logger::ESeverityLevel)
...
#pragma GCC diagnostic pop        // Restore previous default behaviour

您也可以使用 -Wno-missing-field-initializers 在命令行中禁用此行为。