代码之家  ›  专栏  ›  技术社区  ›  anon

kill无符号/有符号比较错误

  •  4
  • anon  · 技术社区  · 16 年前

    一般来说,我需要未签名vs已签名的警告。

    然而,在这个特殊的情况下,我希望它被抑制;

    std::vector<Blah> blahs;
    
    for(int i = 0; i < blahs.size(); ++i) { ...
    

    我想扼杀这种比较。

    谢谢!

    (使用g++)

    1 回复  |  直到 14 年前
        1
  •  12
  •   GManNickG    14 年前

    你应该修复,而不是压制。使用无符号类型:

    for (size_t i = 0; i < blahs.size(); ++i)
    

    您也可以使用 unsigned 但是 size_t 在这里更合适(可能有一个不同的、更大的范围)。如果你只使用 i 要迭代而不需要循环中的值,请改用迭代器:

    for (auto iter = blahs.begin(), end = blahs.end(); iter != end; ++iter)
    

    如果编译器不支持 auto 替换 汽车 具有 T::iterator T::const_iterator 在哪里 T 是什么类型 blahs . 如果编译器支持C++ 11的一个更完整的子集,那么,这样做:

    for (auto& element : blahs)
    

    这是最好的。


    严格地说,上述内容不“正确”。应该是:

    typedef std::vector<Blah> blah_vec;
    blah_vec blahs;
    
    for (blah_vec::size_type i = 0; i < blahs.size(); ++i)
    

    但这可能很冗长,我知道的每个实现都使用 西泽特 作为 size_type 不管怎样。


    如果出于某种原因,您确实需要 ,你必须铸造:

    // assumes size() will fit in an int
    for (int i = 0; i < static_cast<int>(blahs.size()); ++i)
    
    // assumes i will not be negative (so use an unsigned type!)
    for (int i = 0; static_cast<size_t>(i) < blahs.size(); ++i)
    
    // and the technically correct way, assuming i will not be negative
    for (int i = 0; static_cast<blah_vec::size_type>(i) < blahs.size(); ++i)
    
    推荐文章