为啥这个例子只适用于断点

Posted

技术标签:

【中文标题】为啥这个例子只适用于断点【英文标题】:Why would this exemple only works with a breakpoint为什么这个例子只适用于断点 【发布时间】:2019-01-10 01:57:16 【问题描述】:

我正在用 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 上的新项目中尝试过这段代码,没有任何问题

我相信这与我的项目设置有关。

【问题讨论】:

您使用的是哪个版本的 windows? @StereoBucket 我使用的是 Windows 10 你能提供具体的构建吗?或者更好的是,在 project/properties -> general 下,SDK 版本是什么。 @StereoBucket Windows SDK 版本为 10.0.17134.0 @Tom23,未在 VS 2017 15.9.4 和 Windows SDK 10.0.17763.0 中重现 【参考方案1】:

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

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

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

Relevant MS Dev Community bug report。 (固定)

【讨论】:

好像是这个问题,更新VS解决了,谢谢!

以上是关于为啥这个例子只适用于断点的主要内容,如果未能解决你的问题,请参考以下文章

为啥在调试没有断点的访问区域时使用eclipse?

为啥这只适用于 main 中的所有内容?

Flexbox 代码适用于除 Safari 之外的所有浏览器。为啥?

为啥 django 的 prefetch_related() 只适用于 all() 而不是 filter()?

为啥按照angular2官网的例子做没有结果

redis的配置