#ifdef Q_OS_WIN32,但是在此范围内未声明Windows函数

时间:2014-05-13 13:14:21

标签: c++ windows qt winapi qtcore

我有以下代码:

#ifdef Q_OS_WIN32
    Sleep(25);
#endif

写在Windows上的Qt。我知道之前编译过的代码,但由于某种原因,现在它说Sleep并未在此范围内声明。必须有一些解决方法,而无需添加

#include "windows.h"

任何经验/建议都会很棒!!

2 个答案:

答案 0 :(得分:1)

如果通过Qt提供了一个特定于平台的调用,则不应该使用特定于平台的调用,因此在这种情况下,您可能应该使用QThread :: msleep。

为了回答你之前为什么有效,而不是现在的问题,我猜你在某一点上包含的一些标题包含的内容比应该包含的多得多,并且在Qt 5中被清理了。这可能会令人沮丧,但是从长远来看,最有可能是有益的。

答案 1 :(得分:1)

  

必须有一些解决方法,而无需添加

你需要包含它的官方MSDN documentation says,所以请不要避免它。

这是一个很好的做法,总是明确你的依赖关系,以避免隐藏的依赖性问题,当一些包含的头文件不再帮助你透明地包含你的依赖项时,它可能随时爆发。

这可能就是这里发生的事情,你的某些依赖关系清理了库,不包含不必要的东西,或者它只是在内部重新设计。

或者,此功能在WinBase.h之前已根据文档提供,现在如果您切换到较新的Windows,它也可能会出现隐藏依赖项的问题。

要学习的经验教训是,即使您所包含的其他标题中包含的最简单的函数,您也希望明确。

但是,您需要了解

之间的区别
#ifdef Q_OS_WIN32
#include "windows.h"
#endif

#ifdef Q_OS_WIN32
#include <windows.h>
#endif

在这种情况下,您应该使用后者而不是前者,因为后者将用于此类系统标头,而前者通常用于项目中的“本地”标头。

话虽这么说,你应该避免在你的Qt应用程序中使用WinAPI。 QThread或QtTestLib模块已经提供了这种功能。

  

void QThread::msleep(unsigned long msecs) [static]

     

强制当前线程休眠msecs毫秒。

  

void QTest::qSleep(int ms)

     

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

     

ms必须大于0.

     

注意:qSleep()函数在unix上调用nanosleep()或在窗口调用Sleep(),因此在qSleep()中花费的时间精确度取决于操作系统。

     

示例:

     

QTEST :: qSleep(250);

使用Qt 4,您需要在子类中覆盖QThread的受保护睡眠方法并使用它。使用Qt 5,您可以直接使用它,因为它是为了避免公共子类要求API而公开的。