我有以下代码:

// ---- 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
我该怎么办?
  • 禁用这些行的警告
  • 将警告源移至界面:将dxdy设置为int16_t,因此使用move_point函数的用户将可以解决此问题。
  • 只是将dxdy转换为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规避无关。

    我该怎么办?首先,我将决定如何处理溢出-取决于应用程序,它可能会完全不同,即可能是标准溢出行为或截断到最大可能值。然后,我会考虑如何正确地通知用户-这取决于文档的组织方式,是否可以使用断言/异常等。最后,我将通过检查是否有溢出并根据交易策略。

    10-07 19:29
    查看更多