繁体   English   中英

VS2012无符号取反

[英]VS2012 unsigned negate

在应该是可移植性很强的代码中,在很多人,很多环境的项目中,我必须处理一个否定unsigned int代码的问题(在其他地方也遇到相同的问题,否定std::size_t )。

目的是创建该值的加法逆(模MAX_VAL + 1,其中MAX_VAL是该类型的最大值),我发现与此主题有关的其他问题确认这是标准指定的行为。

VS2012(使用我无法轻易学习的编译时选项)将该行错误称为。 有权访问该环境的开发人员将-U更改为-1*U ,该编译器在该环境中进行编译。 我对此更改的看法不高,我对需要进行的可移植性测试(最初更改为正确的代码)不满意。

我希望有一些#pragma,它将告诉VS2012允许-U具有其定义的标准含义。 我希望这比探索-1*U后果要容易得多(除了我认为-1*U令人作呕之外)。

但是我希望在尝试任何语言律师和/或VS2012专家意见之前。

编辑,我应该已经链接了先前的相关答案: 否定size_t(即-sizeof(struct foo)`)会发生什么?

我相信基于该答案的原始代码是正确的。 我想知道如何使VS2012相信代码是正确的。

错误消息是:

error C4146: unary minus operator applied to unsigned type, result still unsigned

#pragma warning (disable : 4146) // VS2012 unary minus operator applied to unsigned type

我没有尝试找出解决方案层次结构中某人添加的不当建议选项,以将不正确的警告转换为令人讨厌的错误。 在源代码中的本地,在正确否定了unsignedstd::size_t的几个地方, #pragma作为注释非常合理,可以使任何人类代码审阅者或MS编译器都清楚,否定了无符号故意的。

我测试过, #pragma确实确实将其从错误转换为无声。

根据项目风格,警告禁用注释中的编译器版本仅告诉哪个编译器/版本触发了添加#pragma的决定。 它无意于暗示此问题可能有多宽或窄(其他编译器或版本)。

如果我控制了所有方面,那么我可能会建议将此警告转变为错误的命令行选项被认为是病态,建议比源代码更好地修复命令行(值得付出所有额外的努力)来查找放置在命令行中的愚蠢选项的地方)。 但实际上,我对该命令行没有任何影响。 可以对这些源文件中的内容做出最终决定,以弥补有关命令行的错误决定。 不能影响什么我可能认为是有关命令行错误的决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM