定义调用约定有什么意义?

时间:2012-03-01 16:54:07

标签: c++

例如:

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?

5 个答案:

答案 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,但是,如果在其他环境中需要它来表示其他内容或什么都没有。