【问题标题】:Warnings when using Boost Serialization with -Wall -Wextra使用带有 -Wall -Wextra 的 Boost 序列化时的警告
【发布时间】:2021-07-22 09:11:11
【问题描述】:

我正在尝试使用Boost.serialize。它似乎工作正常,但是当我使用 g++(版本 10.2.0)打开 -Wextra-Wall 警告时收到警告。

当我关闭警告时,它运行良好,编译良好。但是,我希望能够正确摆脱它们。我已经尝试了几个小时,但找不到解决方案。我发现了一些类似警告的示例,但这些都是未定义默认构造函数的情况。

我在下面创建了一个最小的示例:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

struct minimal {
    minimal()=default;
    minimal(int in) 
        : x {in}
    {}  

    template <typename Archive>
        void serialize(Archive & ar, const unsigned vers){
            ar & x;
        }   

    int x;
};

int main()
{
    std::stringstream ss; 
    boost::archive::text_oarchive oa {ss};

    minimal M {10} ; 
    oa << M;  

    return 0;
}

我编译时的输出是

g++ -Wextra -Wall minimal.cc  -lboost_serialization 

minimal.cc: In instantiation of 'void minimal::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_oarchive]':
/usr/include/boost/serialization/access.hpp:116:20:   required from 'static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = minimal]'
/usr/include/boost/serialization/serialization.hpp:59:22:   required from 'void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = minimal]'
/usr/include/boost/serialization/serialization.hpp:109:14:   required from 'void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = minimal]'
/usr/include/boost/archive/detail/oserializer.hpp:153:40:   required from 'void boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::archive::text_oarchive; T = minimal]'
/usr/include/boost/archive/detail/oserializer.hpp:106:1:   [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/boost/archive/detail/oserializer.hpp:315:22:   required from 'static void boost::archive::detail::save_non_pointer_type<Archive>::invoke(Archive&, const T&) [with T = minimal; Archive = boost::archive::text_oarchive]'
/usr/include/boost/archive/detail/oserializer.hpp:539:18:   required from 'void boost::archive::save(Archive&, T&) [with Archive = boost::archive::text_oarchive; T = const minimal]'
/usr/include/boost/archive/detail/common_oarchive.hpp:71:22:   required from 'void boost::archive::detail::common_oarchive<Archive>::save_override(T&) [with T = const minimal; Archive = boost::archive::text_oarchive]'
/usr/include/boost/archive/basic_text_oarchive.hpp:83:52:   required from 'void boost::archive::basic_text_oarchive<Archive>::save_override(T&) [with T = const minimal; Archive = boost::archive::text_oarchive]'
/usr/include/boost/archive/detail/interface_oarchive.hpp:70:36:   required from 'Archive& boost::archive::detail::interface_oarchive<Archive>::operator<<(const T&) [with T = minimal; Archive = boost::archive::text_oarchive]'
minimal.cc:24:11:   required from here
minimal.cc:11:46: warning: unused parameter 'vers' [-Wunused-parameter]
   11 |  void serialize(Archive & ar, const unsigned vers){
      |                               ~~~~~~~~~~~~~~~^~~~
'''

【问题讨论】:

  • 大多数“linter”会接受/推荐, const unsigned /*vers*/){...

标签: c++ serialization boost boost-serialization


【解决方案1】:

这很容易修复,只需删除未使用的参数名称,或注释掉它的名称。

struct minimal {
    minimal()=default;
    minimal(int in) 
        : x {in}
    {}  

    template <typename Archive>
        void serialize(Archive & ar, unsigned /*vers*/){
            ar & x;
        }   

    int x;
};

对于 C++17,您有 [[maybe_unused]] 属性说明符,例如:

struct minimal {
    minimal()=default;
    minimal(int in) 
        : x {in}
    {}  

    template <typename Archive>
        void serialize(Archive & ar,[[maybe_unused]] unsigned ver){
            ar & x;
        }   

    int x;
};

请参阅此问题以进一步阅读:

Unused parameter in c++11

【讨论】:

  • 是的。这完美!非常感谢。我没有意识到顶部的所有行都是由末尾简单的“常规”警告引起的。
  • @TCD :) boost 的编译错误太可怕了,吓死人了
  • 在我看来[[maybe_unused]] 不适合这个。 ver[[definitely_unused]] :)。带注释的参数名称似乎是更好的解决方案。
  • @alfC 我同意你的看法。我会更新答案。
  • @alfC 两者,我讨厌图书馆每次都以相同的无意义繁文缛节提供示例代码,以至于图书馆的临时用户将在全球范围内复制数千次,因为“也许它重要的”。 [与其他货物崇拜领域类似,如类与结构、getter/setter、不必要的特殊成员等。] 顺便说一下,这在很大程度上是我最不喜欢 Spirit X3 文档的地方。只是跳了很多圈,但真正的圈是看不见的。
猜你喜欢
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2022-01-07
  • 2018-08-30
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多