【发布时间】:2021-02-25 11:43:45
【问题描述】:
据我了解,调用者和被调用者都需要具有相同的调用约定。否则,堆栈可能已损坏。
WinMain 用__stdcall 声明并调用我定义的所有函数。这是否意味着我定义的所有函数都应该使用stdcall 调用约定?
我试过不使用__stdcall 并没有发生任何不好的事情。我还看到支持 Windows 的知名 GUI 库不使用 stdcall。为什么堆栈没有损坏?
【问题讨论】:
-
调用者和被调用者必须就被调用者的调用约定达成一致。调用者和被调用者本身有不同的约定是很常见的。您可能已经在自己做:C 标准库中的所有函数都是 cdecl,但您可以从 WinMain 调用它们。
-
调用约定是调用者和被调用者之间的契约。如果您调用库(如 Windows API),则必须遵循库的合同。如果你实现了一个库,你可以决定使用哪个调用约定。如果您以 x64 为目标,事情就不那么复杂了:只有一种调用约定。
标签: c winapi calling-convention