是的,我知道"cdecl“是一个重要的调用约定的名称,所以请不要向我解释调用约定。我想问的是缩写(?)"cdecl“实际上代表。我认为这是一个糟糕的命名选择,因为乍一看,它让人想起"C声明者“(C的一个相当独特的语法方面)。事实上,有一个名为cdecl的程序,它的唯一目的就是破译C语言的声明符。但据我所知,C声明器语法与调用约定没有任何关系。
简化版:"stdcall“代表”标准调用约定“。"cdecl“代表什么?
发布于 2021-11-04 00:02:24
CDECL一词源于微软的BASIC及其混合语言编程生态系统。生态系统允许微软的四种主要语言(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中新的调用约定(标准调用、快速调用等)的出现,"cdecl“才被增选出来,并成为在没有其他术语的情况下引用遗留约定的事实名称。
总之,CDECL的意思是"C声明“。它起源于BASIC编译器,而不是C编译器,它是一个随意选择的基本关键字,并且有些多余,因为普通的"C“不能是关键字。
有关CDECL的详细信息可以在1987年的文档中找到:
发布于 2011-02-14 05:13:53
它来自已声明的C函数(与K&R C中常见的未声明的C函数形成对比)。
当时,它与pascal调用约定共存(被调用者清除了堆栈),因此在编程语言之后调用它是有意义的。
Everything you might ever want to know about calling conventions.
发布于 2011-02-14 06:23:09
你读得太多了。它代表了用于调用C函数的实现的调用约定(但对于varargs尤其重要)。
它不必是组合了"C“和”声明“的东西的缩写;名称就是名称,特别是在编程中。助记法有帮助,但即使"malloc“的意思是”分配内存“,它也有额外的含义,我们知道并附加到它上;例如,"alloca”也“分配内存”。
或者以"struct“为例,它”意味着“一个”结构“,但”结构“本身是如此的通用,如果没有我们下意识地赋予"struct”的含义,我们将无可救药地迷失--因为仍在学习术语的新程序员通常会迷失方向。
https://stackoverflow.com/questions/4986844
复制相似问题