错误C4146:一元减运算符应用于无符号类型,结果仍无符号

时间:2016-04-01 03:54:05

标签: c++ visual-studio casting

我尝试在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中解决此问题?

4 个答案:

答案 0 :(得分:3)

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

查找并撤消将其变为错误的更改。然后你可以根据需要禁用它。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

试试这个:

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);

答案 3 :(得分:2)

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

即使&#34;威胁警告为错误&#34;在我的编译器中关闭了,我不得不在我的标题文件中用#pragma warning(disable:4146)编译我的项目,该文件向我显示错误。对你来说,它本来就在 darts.h

里面

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