c – BOOST_STATIC_WARNING
我最近在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),你会很高兴.穿过手指 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |