我有以下代码:
// ---- third party library code ----
struct Point { int16_t x, y; };
void third_party_library__getPoint(Point*);
void third_party_library__setPoint(const Point*);
// ---- my library code ----
void move_point(int dx, int dy)
{
Point pt;
third_party_library__getPoint(&pt);
pt.x += dx;
pt.y += dy;
third_party_library__setPoint(&pt);
}
行
pt.x += dx;
产生警告conversion from 'int' to 'int16_t', possible loss of data
我该怎么办?
dx
和dy
设置为int16_t,因此使用move_point
函数的用户将可以解决此问题。 dx
和dy
转换为int16_t。 assert(dx <= 0x7FFF && dx >= -0x8000 && "too large 'dx' value")
,并希望它在运行调试版本时生效。 最佳答案
对我而言,这里有3个相关但不同的要点:
A.处理溢出的
实际上,这里有两个部分:转换溢出和加法溢出。即使您将int16_t
用作输入,在+=
阶段仍然可能会发生溢出,并且您必须决定如何处理它(当然,您可以简单地忽略它,但这也是一种选择,定义明确结果)。
B.通知用户有关限制
通过选择(3)选项-移至界面,您将通知用户第一次溢出而不是第二次通知。同样,它也不是通知用户的唯一方法。有时,更好的方法是在文档中包含“限制”部分,以使其清晰可见。
C.避免警告
一旦确定了(A),就可以根据自己的决定进行转换,从而使编译器满意。
您的(1)和(3)本质上是同一件事,尽管人们不太喜欢警告抑制。这些选项仅回答“避免”,而不回答“交易”或“通知”。
(2)忽略第二个溢出,并将第一个溢出发送给用户。因此,它会避免和部分通知,忽略交易的一半,而将下半部分留给用户。
(4)仅与Inform有关,而与Deal and规避无关。
我该怎么办?首先,我将决定如何处理溢出-取决于应用程序,它可能会完全不同,即可能是标准溢出行为或截断到最大可能值。然后,我会考虑如何正确地通知用户-这取决于文档的组织方式,是否可以使用断言/异常等。最后,我将通过检查是否有溢出并根据交易策略。