Как подавить предупреждение: отсутствие инициализатора, вызванное Boost.Log и GCC 4.4?

Может ли кто-нибудь сказать мне, как подавить следующее предупреждающее сообщение, которое генерируется Boost.Log и GCC 4.4.7? Мой проект построен в режиме С++ 11 (с -std=c++0x в GCC 4.4.7).

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::ESeverityLevel — это перечисление, определенное в Logger.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://theboostcppplibraries.com/boost.log#ex.log_05


person Akira Okumura    schedule 08.12.2014    source источник


Ответы (1)


Один из подходов — отключить предупреждение в GCC с помощью его встроенного #pragmas. , например

#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.

person slugonamission    schedule 08.12.2014
comment
Большое спасибо за быстрый ответ. Оно работает. Поскольку мой компилятор немного устарел, GCC 4.4.7, я не мог использовать push или pop. Вместо этого я снова включил предупреждение сразу после строки макроса, поставив #pragma GCC diagnostic warning - person Akira Okumura; 08.12.2014