一、函数调用是什么?

  函数调用约定是指在编程中规定函数参数传递方式、堆栈清理责任、返回值传递方式等规则的一种约定。常见的函数调用约定包括:

  1. cdecl(C declaration):参数按照从右往左的顺序入栈,由被调用函数负责清理堆栈。
  2. stdcall(standard call):参数按照从右往左的顺序入栈,由调用者负责清理堆栈。
  3. fastcall:通常用于优化对参数个数较少、寄存器传递速度较快的函数调用,会将前几个参数放入寄存器中。
  4. thiscall:用于类成员函数的调用约定,会将this指针作为函数的隐含参数传递。

不同的编程语言、编译器和操作系统可能采用不同的函数调用约定,因此在进行跨平台或跨语言开发时,需要确保函数调用约定的一致性。



二、为什么有函数调用?


  在没有明确规定函数参数传递方式的情况下,函数参数的传递方式和堆栈清理是由编译器或者操作系统来决定的。不同的编译器和操作系统可能采用不同的规范,这可能会导致不同平台上相同函数的参数传递方式不一致,从而造成兼容性问题。为了确保程序的正确性和可移植性,通常会在函数定义和调用时显式地指定函数调用规范,例如使用stdcall、cdecl等规范。



函数调用约定的认识_参数传递

代码理解:在Windows操作系统下,函数调用使用的是stdcall规约(__stdcall),这是Windows API的标准调用约定。在stdcall规约下,函数参数按照特定顺序压入堆栈,由调用方负责清理堆栈,因此需要明确定义调用约定以确保函数参数传递和堆栈清理的一致性。 而在GNU Compiler Collection (GCC) 编译器中,默认的调用约定是cdecl(C declaration),即按照C语言的声明顺序进行函数调用。在cdecl规约下,函数参数按照从右往左的顺序压入堆栈,由被调用函数负责清理堆栈。