【发布时间】:2013-09-20 05:50:29
【问题描述】:
头文件winbase.h第97行有一个奇怪的类函数宏,如下:
#define Yield()
这是为了什么?
【问题讨论】:
-
你可以打开那些头文件看看为什么DBG是未定义的。可能它被另一个定义为 false 的定义所包裹。
标签: windows winapi visual-c++ macros header
头文件winbase.h第97行有一个奇怪的类函数宏,如下:
#define Yield()
这是为了什么?
【问题讨论】:
标签: windows winapi visual-c++ macros header
Windows 3.x 使用协作多任务模型。所有应用程序(也称为“任务”)曾经在单个线程上的相同内存空间中运行。通常,任务之间的切换是由应用程序主消息循环中的GetMessage API 执行的。 Yield() 曾经是自愿切换到另一个应用程序的方式(例如,如果进行冗长的 CPU 密集型处理)。这是一个related MSKB article,它仍然幸存下来。
当然,Yield() 这样的 API 对于现代多线程、多进程操作系统架构没有意义。 因此,Microsoft 将其替换为空宏以尝试实现编译级代码兼容性。
有趣的是,在 .NET 4.5 中,Yield() 以某种形式一直是 reincarnated。其目的是推迟当前SynchronizationContext(或池线程,如果没有同步上下文)上的异步方法的继续。有趣的是,在 .NET 应用程序的主 UI 线程中使用 Task.Yield() 实际上允许组织类似级别的协作多任务处理,Windows 3.x 必须提供。
【讨论】:
stdafx.h 中,在windows.h 之后但在您自己的任何包含文件之前执行#undef Yield。
-Umacroname 允许取消定义预定义的宏,但这对您没有帮助,因为 Yield 将再次被定义 - 由 winbase.h。如果您不想在自己的代码中使用#undef Yield(在包含windows.h 之后),请尝试相反的方式:在编译器的选项中定义它:-DYield=Yield。看看这是否优先。