为啥这个例子只适用于断点
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解决了,谢谢!以上是关于为啥这个例子只适用于断点的主要内容,如果未能解决你的问题,请参考以下文章
Flexbox 代码适用于除 Safari 之外的所有浏览器。为啥?