C++ Windows调用约定

C++ Windows调用约定,c++,windows,C++,Windows,嗨,一位朋友告诉我: 调用约定是C++函数说明符,它决定调用另一函数的函数是否应该清除堆栈帧,或者将是调用函数的任务。 这是真的吗 还有,清洁部分怎么做 用syscall函数调用另一个函数来查找程序集 提前感谢。历史上,Fortran和Pascal语言使用一种约定,调用者在堆栈上推送其参数(堆栈中的第一个参数),然后调用被调用者函数。被调用方中的序言代码通常弹出返回地址和参数,然后再次推送返回地址(这部分实际上是一个实现细节)。当被调用方返回时,堆栈是干净的 然后,C语言就具备了调用具有可变参数

嗨,一位朋友告诉我:

调用约定是C++函数说明符,它决定调用另一函数的函数是否应该清除堆栈帧,或者将是调用函数

的任务。 这是真的吗

还有,清洁部分怎么做 用syscall函数调用另一个函数来查找程序集


提前感谢。

历史上,Fortran和Pascal语言使用一种约定,调用者在堆栈上推送其参数(堆栈中的第一个参数),然后调用被调用者函数。被调用方中的序言代码通常弹出返回地址和参数,然后再次推送返回地址(这部分实际上是一个实现细节)。当被调用方返回时,堆栈是干净的

然后,C语言就具备了调用具有可变参数数的函数的能力。约定是调用方按相反顺序推送参数(堆栈中的最后一个参数排在第一位),然后调用被调用方函数。然后被调用者访问堆栈中的参数而不弹出任何内容(第一个参数的地址就在返回地址附近)。当被调用者返回时,堆栈仍然包含参数,调用者应该清除这些参数


这仍然在Windows系统中使用,其中API函数大部分使用PASCAL约定(WINAPI < /C>),而默认情况下C或C++方法默认使用C(<代码> CDECL < /COD>)约定。

< P>历史上,FORTRAN和PASCAL语言使用了一种约定,其中调用方将其参数推到堆栈上。(堆栈中的第一个参数),然后调用被调用方函数。被调用方中的序言代码通常弹出返回地址和参数,然后再次推送返回地址(这部分实际上是一个实现细节)。当被调用方返回时,堆栈是干净的

然后,C语言就具备了调用具有可变参数数的函数的能力。惯例是调用方按相反顺序(堆栈中的最后一个参数排在第一位)推送参数,然后调用被调用方函数。然后被调用方访问堆栈中的参数,而不弹出任何内容(第一个参数的地址就在返回地址附近)。当被调用方返回时,堆栈仍然包含参数,调用方应该清除它们


这仍然在Windows系统中使用,其中API函数大部分使用PASCAL约定(<代码> WINAPI < /COD>),而默认C或C++方法默认使用C(<代码> CDDEL< /代码>)约定。

是的,这基本上是正确的。每个函数都有一个调用约定,无论是显式的还是隐含的,它保护调用方或被调用方是否有责任恢复堆栈(如果有的话)参数应该在寄存器中传递,以此类推。这就是您要寻找的:?没有标记为重复,因为它没有“清洁部件在部件中的外观如何”的答案。调用约定不是函数说明符。调用约定是可调用对象的调用方和被调用方之间的约定。函数说明符可能包含编译器实现此约定的信息。仅供参考-是的,基本上是这样。每个函数都有一个显式或隐式的调用约定,用于保护它是否为cal如果(某些)参数应该在寄存器中传递,ler或被调用方负责还原堆栈,等等。这就是您要寻找的:?没有标记为重复,因为它没有“清洁部件在部件中的外观如何”的答案。调用约定不是函数说明符。调用约定是可调用对象的调用者和被调用者之间的约定。函数说明符可能包含编译器实现此约定的信息。仅供参考-请注意,对于Windows上的64位进程,所有调用约定现在都相同:请注意,对于Windows上的64位进程Windows所有调用约定现在都相同: