为什么这个例子只适用于断点

Why would this exemple only works with a breakpoint

我正在 C/C++ 中创建一个基本的控制台应用程序。

在下面的示例中,我以 50 毫秒的延迟重复向控制台写入一些字符,我希望它在我按下某个键时退出程序。

#include "pch.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>

int PauseRet(int iDuree) {
    unsigned int uiTemps = GetTickCount();
    int iVal = 0;
    do {
        if (_kbhit()) {
            iVal = _getch();
        }

    } while ((GetTickCount() - uiTemps) < (unsigned int)iDuree);

    return iVal;
}

int main()
{
    char c = 0;
    int iTempo = 50;
    while (true) {


        putchar('a');

        c = PauseRet(iTempo);


        if (c) {

            return 0;
        }

    }
}

我的问题是,在我的项目中,只有当我在此处放置一个断点时,它才会进入条件 if(c){...

    if (_kbhit()) {
        <BREAKPOINT> iVal = _getch();
    }

我正在使用 visual studio 2017.

我在新项目的另一台 PC 上试过这段代码,没有遇到任何问题

我认为这与我的项目设置有关。

您可能 运行 遇到 _getch() 的小错误。在 SDK 10.0.17134.0 上,错误是 _getch() 将 return 按下的键,并在下一次调用时 return 0。

如果没有断点,_kbhit 可能 return 不止一次为真,这会将 0 放入 c 而你的 if(c) 将永远不会通过。
使用断点,一旦你按下该键,它就会停在那里,该键随后会及时释放,一旦你从断点继续,_getch() 将 return 按下的键,并且_kbhit 将不再 return 正确。一旦循环退出,您将在 c 中获得一个非零值。

要解决此问题,请通过 运行 VS 2017 设置再次更新您的 SDK 并更新(或降级到 4 月更新之前的内容)and/or 下载更新的 SDK 或使用 _getwch()

Relevant MS Dev Community bug report。 (固定)