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

vuv7lop3  于 2023-08-07  发布在  其他
关注(0)|答案(5)|浏览(160)

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

9vw9lbht

9vw9lbht1#

C4146不应是错误。这仅仅是一个警告。如果您在您的案例中将其视为错误,则表示有人以这种方式配置了它,很可能是无意的。没道理啊。
查找并撤消使其变为错误的更改。然后,您可以根据需要将其禁用。

zf9nrax1

zf9nrax12#

对于其他人,我想添加另一个答案,以防他们像我一样遇到这个bug。
即使在我的编译器中关闭了“Threat warning as error”,我也不得不在显示错误的头文件中使用#pragma warning(disable:4146)编译我的项目。对你来说应该是在 dart 里
请注意,在我的项目中禁用全局警告不起作用(编译器/wd4146),需要在头文件中直接使用pragma行。

gg0vcinb

gg0vcinb3#

siblings变量也有一元减号,也许这就是罪魁祸首?另外,如果它是模板化代码,你不能真正确定value_是short,int还是long,除非通过static_assert或其他方式Assert。我们只能猜测,因为您没有提供有关实际使用的类型或可复制的信息。另外,在VS2015中是否使用了完全相同的项目进行编译?如果没有,则可能只是在该处禁用了警告。
无论如何,假设它是VS2013中的一个bug,它可能永远不会得到修复,所以你可以尝试找到一个变通办法。首先,将语句分解为更小的语句,直到您确切地知道哪个部分是问题所在(或者,到那时问题已经消失,因为它伴随着编译器错误)。然后使用#pragma warning ( disable : 4146 )抑制警告,并将其 Package 在条件指令中,这样它只对VS2013有效#if _MSC_VER > 1800 && _MSC_VER < 1900应该做得很好。请在陈述式之后再次启用警告。添加关于禁用警告的原因的备注,并将变更作为补丁提交至CRF++。

eit6fx6z

eit6fx6z4#

试试这个:

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

字符串

h4cxqtbf

h4cxqtbf5#

对于任何人来说,这是一个真正令人困惑的部分:
这不应该是一个错误。事实上,有一堆警告说Visual Studio在默认情况下错误地变成了错误。编译器可以为任何他们想要的东西添加警告,但是为有效代码抛出错误只是一个bug。
罪魁祸首是“SDL检查”选项。它以添加运行时堆栈检查之类的东西而闻名,这很好,但他们偷偷地加入了一些肮脏的东西:“并将额外的安全相关警告作为错误启用”。这需要关闭,以获得稍微接近标准C++编译器的东西。

相关问题