【问题标题】:Why did Microsoft define WINAPI, CALLBACK, and APIENTRY to all refer to __stdcall?为什么微软定义WINAPI、CALLBACK、APIENTRY都指__stdcall?
【发布时间】:2014-08-12 10:06:44
【问题描述】:

对于曾经为负责定义这些宏的 Microsoft 团队工作过、认识工作过的人或与 Microsoft 团队有任何关系的任何人,这是一个好奇的问题。

我了解 __stdcall 是什么,并且知道为什么要使用它,但我只是不明白微软为什么要为同一件事制作三个单独的宏。我能看到的唯一好处是在源文件中提供一些语义含义,但除此之外,据我所知,它没有提供其他好处。显然这样做是有道理的,我只是想知道它是什么! :)

【问题讨论】:

标签: c winapi macros stdcall


【解决方案1】:

看来您对用于提供语义信息的不同宏是正确的。 MSDN 这么说 CALLBACK:

CALLBACK、WINAPI 和 APIENTRY 都用于定义函数 __stdcall 调用约定。 Windows API 中的大多数函数 使用 WINAPI 声明。您可能希望将 CALLBACK 用于 您实现的回调函数以帮助将函数识别为 回调函数。

WINAPIAPIENTRY 都被称为:

系统函数的调用约定。

我不知道为什么系统函数有两个宏。

【讨论】:

    【解决方案2】:

    ooga 答案的链接是https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types

    更多详情由微软'Understanding SAL'提供:

    “Microsoft 源代码注释语言 (SAL) 提供了一组注释,您可以使用这些注释来描述函数如何使用其参数、它对参数所做的假设以及它在完成时所做的保证。注释在头文件 中定义。C++ 的 Visual Studio 代码分析使用 SAL 注释来修改其对函数的分析。有关用于 Windows 驱动程序开发的 SAL 2.0 的更多信息,请参阅用于 Windows 驱动程序的 SAL 2.0 注释。

    在本质上,C 和 C++ 只为开发人员提供了有限的方式来一致地表达意图和不变性。通过使用 SAL 注释,您可以更详细地描述您的函数,以便使用它们的开发人员可以更好地了解如何使用它们。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2018-07-31
      • 2010-10-29
      相关资源
      最近更新 更多