fre*_*low 23 c c++ cdecl calling-convention nomenclature
是的,我知道"cdecl"是一个突出的调用约定的名称,所以请不要向我解释调用约定.我要问的是缩写(?)"cdecl"实际上代表什么.我认为这是一个糟糕的命名选择,因为乍一看它提醒了一个"C声明者"(C的一个相当独特的句法方面).实际上,有一个名为cdecl的程序,其唯一目的是解密C声明符.但据我所知,C声明符语法与调用约定完全无关.
简化版:"stdcall"代表"标准调用约定"."cdecl"代表什么?
Pee*_*ger 26
它来自声明的C函数(与未声明的C函数相反,这在K&R C中很常见).
当它与pascal调用约定共存时(被调用者清除堆栈),所以在编程语言之后调用它是有意义的.
Gol*_*rol 11
C声明.由/为C引入的声明
[编辑]
老实说,我不得不承认,我真的不知道这是什么,是代表,虽然它是由/为C.实际推出但由于caller
有清理分配的内存(相对于其他大多数调用约定).它也可能是"来电者终结"的助记符,我认为这实际上是一个很好的记忆辅助工具.:d
Fre*_*urk 10
你读的太多了.它代表一般调用C函数的实现的调用约定(但对于varargs尤其重要).
它不一定是结合"C"和"声明"的缩写; 名称只是名称,特别是在编程中.助记符有帮助,但即使"malloc"意味着"分配内存",它还具有我们所知道并附加于其上的附加含义; 例如,"alloca"也"分配内存".
或者采用"结构","意味着"一个"结构",但"结构"本身是如此通用,没有我们潜意识地附加到"结构"的意义,我们将无可救药地丢失 - 因为新的程序员仍在学习术语经常丢失.
CDECL 一词源自 Microsoft 的 BASIC 及其混合语言编程生态系统。该生态系统允许 Microsoft 四种主要语言(BASIC、FORTRAN、Pascal 和 C)中的任何一种语言调用任何其他语言。每种语言的调用约定都略有不同,并且每种语言都有一种方法来声明使用特定约定的外部函数或过程。
在 BASIC 中,DECLARE
必须先使用该语句,然后才能使用该语句调用外部函数CALL
。要表示外部 FORTRAN 或 Pascal 过程或函数,您可以编写以下之一
DECLARE SUB Foo ()
DECLARE FUNCTION Foo ()
Run Code Online (Sandbox Code Playgroud)
C 调用约定与其他语言的部分不同是因为参数以相反的顺序压入堆栈。您可以通过添加 CDECL 修饰符来通知 BASIC:
DECLARE SUB Foo CDECL ()
DECLARE FUNCTION Foo CDECL ()
Run Code Online (Sandbox Code Playgroud)
相比之下,当用 FORTRAN 或 Pascal 编写时,修饰符是 [C]。这表明 CDECL 特定于 BASIC 的 DECLARE 语句,而不是先前建立的术语。当时,还没有“C 调用约定”的具体术语。只有随着 WIN32 中新的调用约定(stdcall、fastcall 等)的出现,“cdecl”才被增选并成为在没有其他术语的情况下引用旧约定的事实上的名称。
综上所述,CDECL的意思是“C声明”。它起源于 BASIC 编译器,而不是 C 编译器,并且它是任意选择的 BASIC 关键字,并且有些多余,因为普通的“C”不能是关键字。
有关 CDECL 的详细信息可以在这份 1987 年的文件中找到: