![](/img/trans.png)
[英]How to avoid problems with size_t and int types in 64bit C++ builds?
[英]How to avoid size_t to int casting warnings when porting to 64 bit?
我必须将非常大的C ++传统代码库转换为64位。 我设法获得了要编译的基本模块之一,但是即使在这个小模块中,我也会收到800条警告:
warning C4267: = conversion from size_t to int, possible loss of data
我知道为什么会出现这些,但是要摆脱它们我有什么选择? 有没有什么系统的方法可以避免碰到每个实例?
一种选择是禁用“数据丢失”警告。 为了限制禁用警告的效果,MS Visual Studio具有push
和pop
指令:
#pragma warning(push)
#pragma warning(disable: 4267)
// legacy code
#pragma warning(pop)
// normal code
这些#pragma
伪指令特定于Visual Studio; 您可能想用#ifdef _MSC_VER
来包装它们。
这是思想。 我敢肯定,这些警告中的+ 90%可以忽略。 我有类似的问题,并且对以下内容有很多警告:
sumeType tab[10];
int items = std::size(tab);
// or
functionWhichExeptsInt(std::size(tab))
在上面的示例中,由于std::size
是constexpr
编译器可以检测到size值足够小以适合int
因此它不应报告warring,但可以。
问题是,在某些情况下此警告可以检测到实际问题。 因此,禁用此警告不是一个好方法。
在我的项目中,我们决定继续交战,但不要将其视为错误:
这更像是精神问题:“我现在可以忽略那些+100的警告吗?”。 我也喜欢没有警告的代码,但有时最好与它们一起生活。
IMO这是一种更安全的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.