首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"cdecl“代表什么?

"cdecl“代表什么?
EN

Stack Overflow用户
提问于 2011-02-14 05:00:14
回答 8查看 14.3K关注 0票数 37

是的,我知道"cdecl“是一个重要的调用约定的名称,所以请不要向我解释调用约定。我想问的是缩写(?)"cdecl“实际上代表。我认为这是一个糟糕的命名选择,因为乍一看,它让人想起"C声明者“(C的一个相当独特的语法方面)。事实上,有一个名为cdecl的程序,它的唯一目的就是破译C语言的声明符。但据我所知,C声明器语法与调用约定没有任何关系。

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2021-11-04 00:02:24

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

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

代码语言:javascript
复制
DECLARE SUB Foo ()
DECLARE FUNCTION Foo ()

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

代码语言:javascript
复制
DECLARE SUB Foo CDECL ()
DECLARE FUNCTION Foo CDECL ()

相比之下,当用FORTRAN或Pascal编写时,修饰符是C。这表明CDECL特定于BASIC的DECLARE语句,而不是以前建立的术语。当时,没有专门的术语来表示"C调用约定“。只有随着WIN32中新的调用约定(标准调用、快速调用等)的出现,"cdecl“才被增选出来,并成为在没有其他术语的情况下引用遗留约定的事实名称。

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-02-14 05:13:53

它来自已声明的C函数(与K&R C中常见的未声明的C函数形成对比)。

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

Everything you might ever want to know about calling conventions.

票数 30
EN

Stack Overflow用户

发布于 2011-02-14 06:23:09

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

它不必是组合了"C“和”声明“的东西的缩写;名称就是名称,特别是在编程中。助记法有帮助,但即使"malloc“的意思是”分配内存“,它也有额外的含义,我们知道并附加到它上;例如,"alloca”也“分配内存”。

或者以"struct“为例,它”意味着“一个”结构“,但”结构“本身是如此的通用,如果没有我们下意识地赋予"struct”的含义,我们将无可救药地迷失--因为仍在学习术语的新程序员通常会迷失方向。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4986844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档