【问题标题】:C++ COORD errorC++坐标错误
【发布时间】:2016-09-23 03:29:17
【问题描述】:

我目前正在尝试创建俄罗斯方块游戏,当我调用它时:

void PrintChar(int x, int y, char ch, Colors color) {
    COORD c = { y,x };

    FillConsoleOutputCharacterW(GameData::handle, ch, 1, c, NULL);
    FillConsoleOutputAttribute(GameData::handle, color, 1, c, NULL);
}

这个警告出现了:

C4838 - 从“int”转换为“SHORT”需要缩小范围 转换。

有人能解释一下这里发生了什么吗,如果有一个小例子,将不胜感激。

【问题讨论】:

  • 如果您知道COORD 的上下文是什么(我们不知道),警告应该非常清楚。
  • 是否可以写成 'COORD c = {(short)x, (short)y};' ??
  • COORD 实际上是什么?
  • @RelientFX 所以可能是铸造可能会有所帮助,是的。

标签: c++ visual-studio winapi


【解决方案1】:

你应该使用显式类型转换

COORD c = { static_cast<short>(x), static_cast<short>(y) };

【讨论】:

    【解决方案2】:

    您正在使用 copy-list-initialization,这是 C++11 中引入的一种语言功能,可防止隐式(可能)有损转换。在符合 C++11 的编译器中,此构造应该真正产生 error(不仅仅是警告)1

    如果您知道输入永远不会超出目标类型的范围,则一种可能的解决方案是使用static_cast(带有直接列表初始化作为奖励):

    COORD c{ static_cast<SHORT>( x ), static_cast<SHORT>( y ) };
    


    1Visual Studio 会发出一个warning C4838,以防存在潜在的有损缩小转换,无法在编译时进行评估。如果常量表达式的缩小转换确实导致信息丢失,则改为发出error C2397。不过,我不知道这是否符合 C++11 和 C++14。

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 1970-01-01
      • 2012-12-31
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多