我目前正在尝试创建一个俄罗斯方块游戏,当我这样称呼时:
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'转换到'简短'需要缩小范围 转换。
有人可以解释一下这里发生了什么,一个小例子将不胜感激。
答案 0 :(得分:1)
您应该使用显式类型转换
COORD c = { static_cast<short>(x), static_cast<short>(y) };
答案 1 :(得分:0)
您使用的是copy-list-initialization,这是C ++ 11中引入的一种语言功能,可以防止隐式(可能)有损转换。在符合C ++ 11的编译器中,此构造应该真正生成error(而不仅仅是警告) 1 。
一种可能的解决方案是使用static_cast
(使用直接列表初始化作为奖励),如果您知道输入永远不会溢出目标类型的范围:
COORD c{ static_cast<SHORT>( x ), static_cast<SHORT>( y ) };
<小时/> 1 如果存在可能有损的缩小转换,Visual Studio会发出warning C4838,无法在编译时进行评估。如果对常量表达式的缩小转换确实导致信息丢失,则会发出error C2397。不过,我不知道这是否符合C ++ 11和C ++ 14。