#ifdef Q_OS_WIN32,但是在这个作用域中没有声明windows函数
#ifdef Q_OS_WIN32, But windows function is not declared in this scope
我有以下代码:
#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。这一开始可能会令人沮丧,但从长远来看很可能是有益的。
- 未在作用域中声明unordered_map
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 未在此作用域中声明的函数和变量 (C++)
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 重载时未在 C++ 的作用域错误中声明
- 在 C++ 中使用 "transform" 会给出一个错误,指出这未在作用域中声明
- Tictactoe 游戏变量未在作用域中声明
- 当变量在多个函数作用域中使用时,我应该在类 private 中声明该变量吗?
- 如何在C++中嵌套词法作用域可访问的作用域中声明静态信息?
- gets()未在作用域中声明
- 在C++14中,在哪个作用域中声明了重新声明枚举的非范围枚举器
- C++11 外部作用域变量声明为 auto
- 未在此作用域中声明类 (c++)
- 如何声明在函数作用域中定义的结构
- 未在此作用域中声明函数,即使存在头文件也是如此
- 变量声明中结构的作用域解析是什么意思
- 在C++中,在给定的相同作用域内声明相同的变量名
- 我可以使用相同的名称为周围作用域中的类型声明成员类型别名吗
- 类未在作用域中声明,但已声明该类
- 使用新的外部函数作用域声明和初始化变量