【问题标题】:#ifdef Q_OS_WIN32, But windows function is not declared in this scope#ifdef Q_OS_WIN32,但是windows函数没有在这个范围内声明
【发布时间】:2014-05-13 13:14:21
【问题描述】:

我有以下代码:

#ifdef Q_OS_WIN32
    Sleep(25);
#endif

为 Windows 上的 Qt 编写。我知道这段代码以前编译过,但现在由于某种原因它说 Sleep 没有在这个范围内声明。必须有一些方法可以解决这个问题而不必添加

#include "windows.h"

任何这方面的经验/建议都会很棒!!

【问题讨论】:

  • 这一切都很好,但问题是它以前编译过,但现在它不会,以典型的 Qt 方式。那么有一些设置或我需要更改的东西吗?不改代码
  • 为什么你认为一定有某种方法可以使用Sleep而不包括windows.h?您可以通过将其包装在相同类型的 #ifdef Q_OS_WIN32 守卫中来有条件地执行包含。

标签: c++ windows qt winapi qtcore


【解决方案1】:

必须有一些方法可以解决这个问题,而不必添加

官方MSDNdocumentation 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)

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

ms 必须大于 0。

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

例子:

QTest::qSleep(250);

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

【讨论】:

    【解决方案2】:

    如果是通过 Qt 提供的,你不应该使用平台特定的调用,所以在这种情况下你应该使用 QThread::msleep。

    要回答您关于为什么它以前有效而不是现在有效的问题,我猜您在某一时刻包含的某些标头包含的内容远远超出了应有的内容,并且已在 Qt 5 中进行了清理。起初这可能令人沮丧,但是从长远来看最有可能是有益的。

    【讨论】:

    • 实际上,sleep 略有不同,因为它需要以秒为单位的值,而 WinAPI 函数使用毫秒。直接等价的是 msleep 方法。
    猜你喜欢
    • 2018-07-12
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2020-06-08
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多