_stdcall 是Pascal的函数调用规则,参数从左到右入堆栈
_cdecl 是C的函数调用规则,参数从右到左入堆栈

解决方案 »

  1.   

    _cdecl是函数的缺省调用规则,必须有函数的调用者自己清空堆栈;
    _stdcall是API函数的调用规则,由函数自己清空堆栈。
      

  2.   

    CDECL 是使用 C 语言的调用规范。他的调用速度要比 PASCAL 的调用规范慢。
    因为在生成汇编代码后 CDECL 比 PASCAL 多一条汇编指令。
    CDECL 参数压栈是从左到右,PASCAL 是从右到左。
    所以 CDECL 可以实现可变参数。而 PASCAL 不能。
    STDCALL 是 CDECL 和 PASCAL 混合,他的参数压栈是从左到右,清除参数压栈用 PASCAL 方式。
      

  3.   

    CDECL 是使用 C 语言的调用规范。他的调用速度要比 PASCAL 的调用规范慢。
    因为在生成汇编代码后 CDECL 比 PASCAL 多一条汇编指令。
    CDECL 参数压栈是从左到右,PASCAL 是从右到左。
    所以 CDECL 可以实现可变参数。而 PASCAL 不能。
    STDCALL 是 CDECL 和 PASCAL 混合,他的参数压栈是从左到右,清除参数压栈用 PASCAL 方式。
      

  4.   

    平时写函数的时候怎么没有见到函数名称前加_cdecl或者_stacall,是编译器件默认的吗?
      

  5.   

    以上对_stdcall 编译指令理解有误:
    _stdcall 是WINDOWS API函数采用的编译方式。它的入栈方式是从右到左的,由被调用函数自行清栈,编译时,少一条清栈语句,因此,_stdcall编译的目标文件要比_cdecl小一些。其函数命名约定是如:int add(int a,int b) -> _add@8 (8指所有参数所占字节数)
    _cdecl 是C++编译器的默认编译方式,(to robbie:除非你想指明个别函数为不同的编译方式,其他都采用了默认值),它的入栈方式同样是从右到左的,由调用函数清栈(多一条语句哦),其函数命名约定较_stdcall复杂了一些,因为它要满足C++语法的需要,比如类成员函数,函数重灾等,编译器生成的函数名中包含了许多信息 ,如所属类,参数列表。
    以上为,我的见解,请大家指教