定义呼叫约定有什么意义

What is the point of defining a calling convention?

本文关键字:什么 呼叫 约定 定义      更新时间:2023-10-16

例如:

int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )

WINAPI是一个看起来像这样的定义:

#define WINAPI      __stdcall

为什么你不能做:

int __stdcall WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )

实际上,我认为我的问题是,我有点混淆了定义和typedef。有人能向我解释一下吗?define做什么?为什么不能直接在它的位置编写__stdcall?

因为WINAPI调用约定不保证为__stdcall。使用WINAPI的代码即使不是正确的,也仍然是正确的。

可以像后一个例子中那样编写函数,它会很好地工作——这不是一个好的实践,也不能移植到调用约定是其他东西的平台上。

这最初是在从16位代码切换到32位代码期间完成的。在<windows.h>的16位版本中,它是:

#define WINAPI __pascal

WINAPI允许您在不修改源代码的情况下编译任意一个。当然,16位Windows不再是一个因素(至少对大多数人来说是这样),但仍然不值得将所有源代码更改为直接使用__stdcall(尤其是因为有一天它可能会再次更改)。

可以只在其位置写入__stdcall,但不能。他们认为将WINAPI定义为__stdcall以使其不透明是合适的,这只是一种很好的编程实践。

此外,在过去,一些Windows库使用Pascal调用约定,而其他库使用C约定。预处理器定义帮助掩盖了这一点。

因为WINAPI是一个宏(好吧,无论如何都是#define),所以它可以被"预处理"为其他意思,甚至什么都没有。

这意味着您可以编写更可移植的代码,因为当Win32要求它表示__stdcall但是,或者在另一个环境中要求它表示其他或什么都没有时,您可以将其放入WINAPI中。