#ifdef Q_OS_WIN32,但是在这个作用域中没有声明windows函数

#ifdef Q_OS_WIN32, But windows function is not declared in this scope

本文关键字:作用域 声明 函数 windows WIN32 OS #ifdef      更新时间:2023-10-16

我有以下代码:

#ifdef Q_OS_WIN32
    Sleep(25);
#endif

为windows上的Qt编写。我知道这段代码以前编译过,但现在由于某种原因,它说Sleep没有在这个作用域中声明。一定有什么方法可以绕过这个问题而不需要添加

#include "windows.h"
任何经验/建议,这将是伟大的!!

一定有办法绕过这个而不需要添加

MSDN官方文档说你需要包含它,所以请不要回避它。

始终明确你的依赖项是一个很好的做法,以避免隐藏的依赖问题,当某些包含的头文件不再为你透明地包含依赖项提供帮助时,这些问题可能会爆发。

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

或者,根据文档,这个功能在WinBase.h早期可用,现在如果你切换到较新的Windows,它也可以处理隐藏依赖项的问题。

要吸取的教训是,即使是最简单的函数,也要明确地包含在您包含的其他头文件中。

但是,您需要了解 和 之间的区别。
#ifdef Q_OS_WIN32
#include "windows.h"
#endif

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

在这种情况下,您应该使用后者而不是前者,因为后者将用于这样的系统头文件,而前者通常用于"local"

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

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

强制当前线程休眠msecs毫秒

void QTest::qSleep(int ms)

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

ms必须大于0。

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

的例子:

qt: qSleep (250),

在Qt 4中,你需要在子类中覆盖QThread的protected sleep方法并使用它。在Qt 5中,您可以直接使用它,因为它是公开的,因此可以避免常见的子类要求API。

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

回答你的问题,为什么它以前工作,而不是现在,我猜你在某一点上包含的一些头包含了很多比它应该有和清理在Qt 5。这一开始可能会令人沮丧,但从长远来看很可能是有益的。