例如:
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的定义。谁可以给我解释一下这个?定义做了什么以及为什么不能在其位置写__stdcall?
答案 0 :(得分:4)
因为WINAPI
调用约定保证不是__stdcall
。即使不是WINAPI
,使用{{1}}的代码仍然是正确的。
你可以编写函数,就像你在后面的例子中一样,并且它工作得很好 - 它只是不好的做法而且不能移植到调用的平台上惯例是别的。
答案 1 :(得分:4)
这最初是在从16位代码切换到32位代码期间完成的。在<windows.h>
的16位版本中,它是:
#define WINAPI __pascal
WINAPI允许您在不修改源代码的情况下编译。当然,16位Windows不再是一个因素(至少对于大多数人而言),但是仍然不值得更改所有源代码直接使用__stdcall
(特别是因为有一天它可能会再次改变)。
答案 2 :(得分:3)
你可以只在其位置写__stdcall,但不能。他们认为#define WINAPI适合于__stdcall使其变得不透明,这只是一种很好的编程习惯。
答案 3 :(得分:2)
此外,在当天,一些Windows库使用Pascal调用约定,其他库使用C约定。预处理器定义帮助掩盖了这一点。
答案 4 :(得分:1)
因为WINAPI是一个宏(无论如何都是#define),它可以被“预处理”以表示其他内容甚至一无所有。
这意味着您可以编写更多可移植代码,因为当Win32要求使用__stdcall时可以放入WINAPI,但是,如果在其他环境中需要它来表示其他内容或什么都没有。