Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ #ifdef Q_OS_WIN32,但在此范围内未声明windows函数_C++_Windows_Qt_Winapi_Qtcore - Fatal编程技术网

C++ #ifdef Q_OS_WIN32,但在此范围内未声明windows函数

C++ #ifdef Q_OS_WIN32,但在此范围内未声明windows函数,c++,windows,qt,winapi,qtcore,C++,Windows,Qt,Winapi,Qtcore,我有以下代码: #ifdef Q_OS_WIN32 Sleep(25); #endif 为windows上的Qt编写。我知道这段代码以前编译过,但现在出于某种原因,它说Sleep没有在这个范围内声明。一定有办法解决这个问题,而不必添加 #include "windows.h" 任何与此相关的经验/建议都将非常好 如果平台特定的调用是通过Qt提供的,那么您不应该使用平台特定的调用,因此在这种情况下,您可能应该使用QThread::msleep 为了回答您的问题,为什么它以前工作而不是现

我有以下代码:

#ifdef Q_OS_WIN32
    Sleep(25);
#endif
为windows上的Qt编写。我知道这段代码以前编译过,但现在出于某种原因,它说Sleep没有在这个范围内声明。一定有办法解决这个问题,而不必添加

#include "windows.h"

任何与此相关的经验/建议都将非常好

如果平台特定的调用是通过Qt提供的,那么您不应该使用平台特定的调用,因此在这种情况下,您可能应该使用QThread::msleep

为了回答您的问题,为什么它以前工作而不是现在,我想您在某一点上包含的某些标题包含的内容远远超过了它应该包含的内容,并且在Qt5中得到了清理。这在一开始可能令人沮丧,但从长远来看很可能是有益的

一定有办法解决这个问题,而不必添加

#include "windows.h"
官方MSDN你需要包括它,所以请不要避免它

一个很好的实践是,始终明确您的依赖项,以避免隐藏的依赖项问题,当某些包含的头文件不再有利于您透明地包含依赖项时,这些问题随时可能爆发

这可能也是这里发生的事情的原因,您的一些依赖项清理了库,使其不包含不必要的内容,或者只是在内部重新设计

或者,根据文档,此函数在前面的
WinBase.h
中可用,现在,如果切换到较新的Windows,它还可以解决隐藏依赖项的问题

要吸取的教训是,即使对于包含在其他标题中的最简单的函数,您也希望显式

但是,您需要了解两者之间的区别

#ifdef Q_OS_WIN32
#include "windows.h"
#endif

#ifdef Q#u OS#u WIN32
#包括
#恩迪夫
在这种情况下,您应该使用后者而不是前者,因为后者将用于这样的系统头,而前者通常用于项目中的“本地”头

也就是说,您应该避免在Qt应用程序中使用WinAPI。此功能已经由QThread或QtTestLib模块提供

强制当前线程睡眠毫秒数毫秒

休眠毫秒,阻止测试的执行。qSleep()不会执行任何事件处理,并使测试没有响应。网络通信可能在睡眠时超时。使用qWait()执行非阻塞睡眠

ms必须大于0

注意:qSleep()函数在unix上调用nanosleep(),在windows上调用Sleep(),因此花在qSleep()上的时间的准确性取决于操作系统

例如:

QTest::qSleep(250)


对于Qt4,您需要在子类中重写QThread的受保护睡眠方法并使用它。对于Qt5,您可以直接使用它,因为它是出于这个原因公开的,以避免使用要求API的常见子类。

这很好,但问题是它以前编译过,但现在不会,以典型的Qt方式编译。那么,是否有一些设置或我需要更改的内容?在不更改代码的情况下,为什么您认为必须有某种方法使用
睡眠
,而不包括
windows.h
?您可以通过将其包装在相同类型的
#ifdef Q#u OS_WIN32
保护中,有条件地执行包含。实际上,睡眠略有不同,因为它需要以秒为单位的值,而WinAPI函数使用毫秒。直接等效是msleep方法。