为什么我无法在win64上使用boost 1.54编译VS2012 C ++代码?

时间:2014-04-23 13:27:57

标签: c++ c visual-studio-2012 boost 64-bit

我有一个使用VS2010和boost 1_54_0版本编译的win64应用程序 - 一切都按预期工作。

我现在正在将应用程序转移到需要VS2012编译库的新平台。 当尝试使用VS2012编译boost(以后链接到我的项目)时,我得到以下编译器警告:

 1>c:\<my_path>\boost\boost_1_54_0\boost\functional\hash\hash.hpp(176): warning C6295: Ill-defined for-loop:  'unsigned int' values are always of range '0' to '4294967295'.  Loop executes infinitely.
 1>C:\<my_path>\boost\boost_1_54_0\boost/functional/hash/hash.hpp(201) : see reference to function template instantiation 'size_t boost::hash_detail::hash_value_unsigned<T>(T)' being compiled
 1>          with
 1>          [
 1>              T=boost::ulong_long_type
 1>          ]
 1>          C:\<my_path>\boost\boost_1_54_0\boost/functional/hash/hash.hpp(439) : see reference to function template instantiation 'boost::hash_detail::enable_hash_value::type boost::hash_value<boost::ulong_long_type>(T)' being compiled
 1>          with
 1>          [
 1>              T=boost::ulong_long_type
 1>          ]

<my_path>代表我的开发机器上的本地路径,因此可以忽略它)

查看第#176行的hash.hpp文件(例如) - 我看到以下内容

    template <class T>
    inline std::size_t hash_value_unsigned(T val)
    {
         const int size_t_bits = std::numeric_limits<std::size_t>::digits;
         // ceiling(std::numeric_limits<T>::digits / size_t_bits) - 1
         const int length = (std::numeric_limits<T>::digits - 1)
             / size_t_bits;

         std::size_t seed = 0;

         // Hopefully, this loop can be unrolled.
         for(unsigned int i = length * size_t_bits; i > 0; i -= size_t_bits)
         {
             seed ^= (std::size_t) (val >> i) + (seed<<6) + (seed>>2);
         }
         seed ^= (std::size_t) val + (seed<<6) + (seed>>2);

         return seed;
    }

行#176for语句:for(unsigned int i = length * size_t_bits; i > 0; i -= size_t_bits)

现在我似乎不明白编译器警告我的是什么?如果条件为i>=0这有意义(从MSDN对C6295的解释),但for语句逻辑对我来说没问题。

此警告的根本原因是什么?如何解决它?

P.S。因为我的应用程序使用警告级别4(警告被视为错误) - 由于此警告,我无法编译我的应用程序。

由于

1 个答案:

答案 0 :(得分:1)

这已在Boost中修复:https://svn.boost.org/trac/boost/ticket/8568

我建议更新为Boost 1.55,修补你的Boost localy副本,或使用/wd6295禁用该特定警告或使用Boost包含的pragma。

虽然在这种情况下可能不适用于您,但这是强制警告=在已发布源中包含的构建脚本中的错误通常是一件坏事:新编译器版本添加新警告。