加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – BOOST_STATIC_WARNING

发布时间:2020-12-16 06:56:38 所属栏目:百科 来源:网络整理
导读:我最近在C的隐式转换中遇到了一些麻烦,所以我正在寻找一种方法来警告人们,如果有人试图将int32_t分配给uint64_t或其他什么. BOOST_STATIC_ASSERT会为此创造奇迹,除了我正在使用的代码库非常大并且依赖于大量隐式转换,因此立即用断言来破坏所有内容是不现实的
我最近在C的隐式转换中遇到了一些麻烦,所以我正在寻找一种方法来警告人们,如果有人试图将int32_t分配给uint64_t或其他什么. BOOST_STATIC_ASSERT会为此创造奇迹,除了我正在使用的代码库非常大并且依赖于大量隐式转换,因此立即用断言来破坏所有内容是不现实的.

看起来BOOST_STATIC_WARNING对我来说是理想的,但是,我无法让它实际发出警告.这样的事情什么都不会做:

typedef boost::is_same<int64_t,int32_t> same_type;
    BOOST_STATIC_WARNING(same_type::value);

我的编译器是g 4.4.3,其中–std = c 0x -Wall -Wextra.我的提升是1.46.1.

我试图在这里解决的问题是我们有一个缓冲区类型,其中包含uint8_t GetUInt8(size_type index),void SetUInt32(size_type index,uint32_t value)等方法.所以,你会看到这样的用法:

x = buffer.GetUInt16(96);

问题是,在读取16位无符号整数时,无法保证x实际上是16位.虽然最初编写该行的人正确地(希望)做到了,但如果x的类型发生变化,这条线将会无声地破坏.

我的解决方案是创建一个safe_convertable< T>像这样的类型:

template <typename T>
struct safe_convertable
{
public:
    template <typename TSource>
    safe_convertable(const TSource& val)
    {
        typedef boost::is_same<T,TSource> same_type;
        BOOST_STATIC_WARNING(same_type::value);

        _val = val;
    }

    template <typename TDestination>
    operator TDestination ()
    {
        typedef boost::is_same<T,TDestination> same_type;
        BOOST_STATIC_WARNING(same_type::value);

        return _val;
    }
private:
    T _val;
};

并更改方法以返回并接受这些安全引用:safe_reference< uint8_t> GetUInt8(size_type index),safe_reference< uint32_t> value)(这是短版本,还有其他运算符以及你可以对引用做些什么).

无论如何,这适用于BOOST_STATIC_ASSERT,除了我想要警告而不是错误.

对于好奇,我自己实现了警告,它工作正常,但我更喜欢Boost变种,以便我获得所有其他Boost功能(这只适用于一个函数).

namespace detail
{
    template <typename TIntegralContant>
    inline void test_warning(const TIntegralContant&)
    {
        static_cast<void>(1 / TIntegralContant::value);
    }
}

#define MY_STATIC_WARNING(value_) 
    ::detail::test_warning(::boost::integral_constant<bool,value_ >())

解决方法

您使用的是什么版本的Boost?此评论可能是您自己的警告工作的原因,但升级版本不会:

// 6. replaced implementation with one which depends solely on
//    mpl::print<>.  The previous one was found to fail for functions
//    under recent versions of gcc and intel compilers - Robert Ramey

我猜你是否升级到最新版本的Boost(例如1.46.1),你会很高兴.穿过手指

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读