代码之家  ›  专栏  ›  技术社区  ›  Benjamin

为什么微软选择stdcall作为他们的API约定?

  •  5
  • Benjamin  · 技术社区  · 16 年前

    有充分的理由吗?

    它们的内部函数(未导出)是否也是stdcall约定?

    2 回复  |  直到 12 年前
        1
  •  8
  •   Hans Passant    16 年前

    它是对32位代码的帕斯卡呼叫约定的一种改编。Pascal是16位操作系统(如OS/2和Windows3)的调用约定。为什么选择帕斯卡是一个有点猜测,即使我当时是一个小小狗,但它是稍微更有效率。当你只需要640 kb的内存时,它就显得很重要了。

    大多数win32函数不是真正的stdcall,因为它还规定了导出函数在呈现给链接器之前是如何修饰的。就像虚无的咕哝(int arg)变成了“咕哝@4”。@后面的数字表示激活帧的大小。但大多数win32函数都是在没有任何修饰的情况下导出的。可能是为了给程序员一个使getProcAddress()工作的战斗机会。我认为修饰的目的是帮助链接器检测声明的API函数签名和实际的API函数签名之间的不匹配。传递的参数数量不匹配是自动的kaboom,因为被调用方将从堆栈中弹出或多或少的参数,然后传递。也很难诊断。stdcall的一个弱点,cdecl约定没有这个问题。

    内部调用是stdcall、cdecl和thiscall之间的混合包。虽然单步执行的Windows代码不是我喜欢做的事情,但不能说我检测到了模式。

        2
  •  4
  •   Larry Osterman    16 年前

    用stdcall编译的代码明显小于用cdecl编译的代码(可选)。在作出决定时,较小的代码就是更快的代码。