【问题标题】:For what is the function-like macro Yield() in winbase.h (line 97)?winbase.h(第 97 行)中类似函数的宏 Yield() 是什么?
【发布时间】:2013-09-20 05:50:29
【问题描述】:

头文件winbase.h第97行有一个奇怪的类函数宏,如下:

#define Yield()

这是为了什么?

【问题讨论】:

  • 你可以打开那些头文件看看为什么DBG是未定义的。可能它被另一个定义为 false 的定义所包裹。

标签: windows winapi visual-c++ macros header


【解决方案1】:

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 必须提供。

【讨论】:

  • 真正的问题是:我有一个名为 Yield 的成员函数,现在我不能使用这个名称,因为它已被定义为邪恶的宏。我非常喜欢这个名字,因为它在我的课堂上的确切含义。如何解决这个问题呢?谢谢。
  • 只需在stdafx.h 中,在windows.h 之后但在您自己的任何包含文件之前执行#undef Yield
  • 有没有办法通过编译器的选项取消定义宏?比如-DName=1可以定义一个宏;有没有办法取消定义?
  • 也就是说,有没有办法通过编译器的选项取消定义指定的宏?
  • -Umacroname 允许取消定义预定义的宏,但这对您没有帮助,因为 Yield 将再次被定义 - 由 winbase.h。如果您不想在自己的代码中使用#undef Yield(在包含windows.h 之后),请尝试相反的方式:在编译器的选项中定义它:-DYield=Yield。看看这是否优先。
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2015-02-08
  • 1970-01-01
  • 2016-07-21
相关资源
最近更新 更多