"cdecl"代表什么?

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调用约定共存时(被调用者清除堆栈),所以在编程语言之后调用它是有意义的.

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

  • @FredOverflow没有答案回答你的问题?"它来自声明的C函数".即`int main(){char c = 0; F(C); }`传递一个`int`,和`void f(c)char c; 在二进制代码中,即使参数类型为`char`,也需要将参数数据读作`int`.如果你在范围内有一个`void f(char c)`和一个`void f(char c){}`,那么数据将被传递并读作`char` (4认同)
  • @ JohannesSchaub-litb:这个答案只有在没有声明的C函数不使用cdecl调用约定时才有意义,所以你有一些东西可以对比 - 但这是错误的. (4认同)
  • 我确定链接的PDF是一个有趣的读物,但它没有回答我的问题. (3认同)

Gol*_*rol 11

C声明.由/为C引入的声明

[编辑]

老实说,我不得不承认,我真的不知道这是什么,是代表,虽然它是由/为C.实际推出但由于caller有清理分配的内存(相对于其他大多数调用约定).它也可能是"来电者终结"的助记符,我认为这实际上是一个很好的记忆辅助工具.:d

  • 我喜欢"Caller Does End CLeaning"小说,但不幸的是,"Caller"和"Callee"都以字母'C'开头,因此它并不能作为记忆辅助工具:-( (5认同)
  • 那片喧嚣的小说背面+38!如果你能得到它,那就太好了,但你是那个晚上必须要睡觉的人!;-) (3认同)
  • 你是在做这个吗? (2认同)

Fre*_*urk 10

你读的太多了.它代表一般调用C函数的实现的调用约定(但对于varargs尤其重要).

它不一定是结合"C"和"声明"的缩写; 名称只是名称,特别是在编程中.助记符有帮助,但即使"malloc"意味着"分配内存",它还具有我们所知道并附加于其上的附加含义; 例如,"alloca"也"分配内存".

或者采用"结构","意味着"一个"结构",但"结构"本身是如此通用,没有我们潜意识地附加到"结构"的意义,我们将无可救药地丢失 - 因为新的程序员仍在学习术语经常丢失.

  • @PeerStritzinger:我没有说这意味着什么,但是,呃,谢谢你的失败,因为你误解了. (3认同)
  • 这个答案是用定义来回答词源学问题的。是的,单词的含义超出了词源,但它们“仍然有词源”。 (2认同)

Cur*_*urt 5

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 年的文件中找到:

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