【问题标题】:error C4146: unary minus operator applied to unsigned type, result still unsigned错误 C4146:一元减号运算符应用于无符号类型,结果仍然无符号
【发布时间】:2016-04-01 03:54:05
【问题描述】:

我尝试在 Visual Studio 2013 中构建 CRF++,并在最后一行出现此错误:

array_[begin + siblings[i].code].base =
            value_ ?
            static_cast<array_type_>(-value_[siblings[i].left]-1) :
            static_cast<array_type_>(-siblings[i].left-1);

错误 C4146:一元减号运算符应用于无符号类型,结果 还没有签名

具体来说,它位于 darts.h 的第 189 行。

我在 Visual Studio 2015 中再次构建,然后没有错误。

如何在 Visual Studio 2013 中解决此问题?

【问题讨论】:

  • value_的类型是什么?
  • @HappyCoder: array_type_ *value_;
  • array_type_被定义为?
  • 为什么static_cast&lt;array_type_&gt; 的东西如果已经 array_type_ 一旦通过value_[...] 取消引用,你上面说过的value_array_type_*
  • @HappyCoder:模板类型可以是short、int或long。

标签: c++ visual-studio casting


【解决方案1】:

C4146 不应该是一个错误。这只是一个警告。如果您将其视为您的案例中的错误,则意味着有人以这种方式配置它,很可能是无意的。这是没有意义的。

查找并撤消导致错误的更改。然后,您可以根据需要禁用它。

【讨论】:

  • 谢谢,AnT。我从错误列表窗口中获取此信息。我默认安装了 Visual Studio 2013,并且没有更改项目的设置和属性中的任何内容。我读了几篇关于“将警告视为错误”的帖子,但没有用。
  • 这个问题的一个版本似乎是 Visual Studio 中的a long-standing bug。据说它已在(撰写本文时即将发布的)16.4 预览版 1 中修复。
【解决方案2】:

对于其他人,我想添加另一个答案,以防他们像我一样偶然发现该错误。

即使在我的编译器中关闭了“威胁警告为错误”,我也必须在显示错误的头文件中使用 #pragma warning(disable:4146) 编译我的项目。对你来说,它应该在 darts.h

里面

请注意,在我的项目中全局禁用警告不起作用(编译器/wd4146),直接在头文件中需要编译指示行。

【讨论】:

    【解决方案3】:

    siblings 变量也应用了一元减号,也许这就是罪魁祸首?此外,如果它是模板化代码,则您无法确定 value_ 将是 short、int 或 long,除非通过 static_assert 左右断言。我们只能猜测,因为您没有提供有关实际使用的类型或可重现的信息的信息。您是否也使用完全相同的项目在 VS2015 中进行编译?如果没有,警告可能只是在那里被禁用了。

    无论如何,假设它是 VS2013 中的一个错误,它可能永远不会得到修复,因此您可以尝试找到解决方法。首先将该语句分解为较小的语句,直到您确切知道问题所在的部分(或者,到那时问题已经消失,因为它与编译器错误有关)。然后用#pragma warning ( disable : 4146 ) 抑制警告,包裹在一个条件指令中,所以它只对VS2013 有效#if _MSC_VER &gt; 1800 &amp;&amp; _MSC_VER &lt; 1900 应该没问题。在语句之后再次启用警告。添加关于为什么禁用警告的注释并将更改作为补丁提交到 CRF++。

    【讨论】:

      【解决方案4】:

      试试这个:

      int tmp = static_cast<int>(siblings[i].left);
      
      array_[begin + siblings[i].code].base =
                  value_ ?
                  static_cast<array_type_>(-value_[siblings[i].left]-1) :
                  static_cast<array_type_>(-tmp - 1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多