定义呼叫约定有什么意义
What is the point of defining a calling convention?
例如:
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中。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 什么是呼叫说明
- 我是否错过了什么,或者虚拟呼叫的性能并不像人们所说的那样糟糕
- 呼叫"spin"意味着什么
- 定义呼叫约定有什么意义