“cdecl”代表什么?

新手上路,请多包涵

是的,我知道“cdecl”是一个显着的调用约定的名称,所以请不要向我解释调用约定。我要问的是缩写(?)“cdecl”实际上代表什么。我认为这是一个糟糕的命名选择,因为乍一看它让人想起“C 声明符”(C 的一个相当独特的句法方面)。事实上,有一个名为 cdecl 的程序,其唯一目的是破译 C 声明符。但据我所知,C 声明符语法与调用约定完全无关。

简化版:“stdcall”代表“标准调用约定”。 “cdecl”代表什么?

原文由 fredoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 504
2 个回答

CDECL 一词源于 Microsoft 的 BASIC 及其混合语言编程生态系统。该生态系统允许 Microsoft 的四种主要语言(BASIC、FORTRAN、Pascal 和 C)中的任何一种调用任何其他语言。每种语言都有稍微不同的调用约定,并且每种语言都有一种方法来声明外部函数或过程以使用特定的约定。

在 BASIC 中,必须先使用 DECLARE 语句,然后才能使用 CALL 语句调用外部函数。要表示外部 FORTRAN 或 Pascal 过程或函数,您可以编写以下之一

DECLARE SUB Foo ()
DECLARE FUNCTION Foo ()

C 调用约定与其他语言不同,部分原因是参数以相反的顺序压入堆栈。您可以通过添加 CDECL 修饰符来告知 BASIC:

 DECLARE SUB Foo CDECL ()
DECLARE FUNCTION Foo CDECL ()

相反,当用 FORTRAN 或 Pascal 编写时,修饰符是 [C]。这表明 CDECL 特定于 BASIC 的 DECLARE 语句,而不是先前建立的术语。当时,“C 调用约定”没有特定的术语。只有随着 WIN32 中新的调用约定(stdcall、fastcall 等)的出现,“cdecl”才被采用并成为事实上的名称,以在没有其他术语的情况下指代遗留约定。

总之,CDECL 的意思是“C 声明”。它起源于 BASIC 编译器,而不是 C 编译器,它是一个任意选择的 BASIC 关键字,并且有些多余,因为普通的“C”不能是关键字。

关于 CDECL 的详细信息可以在这个 1987 年的文档中找到:

https://archive.org/details/Microsoft_Macro_Assembler_5.1_Mixed_Language_Programming_Guide/page/n1/mode/2up?q=cdecl

原文由 Curt 发布,翻译遵循 CC BY-SA 4.0 许可协议

它来自已声明的 C 函数(与未声明的 C 函数相反,这在 K&R C 中很常见)。

当时它与 pascal 调用约定(被调用者清除堆栈的地方)共存,因此在编程语言之后调用它是有道理的。

你可能想知道的关于调用约定的一切。

原文由 Peer Stritzinger 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题