前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >X#(XSharp)中的调用约定

X#(XSharp)中的调用约定

作者头像
firstxinjie
发布于 2025-03-27 06:20:01
发布于 2025-03-27 06:20:01
4800
代码可运行
举报
文章被收录于专栏:X#(XSharp)X#(XSharp)
运行总次数:0
代码可运行

第一次接触“调用约定”这个概念居然是写了 N 年 VFP 程序之后。

X# 的官方文档中,对调用约定的解释是这样的:调用约定是非托管世界的东西。它们描述了调用函数或方法时应如何传递参数,还描述了被调用函数/方法返回时由谁负责调整堆栈。

首先要理解什么是托管和非托管。

AI 是这样回答大致是这样的:托管是由 .NET运行时(CLR)管理的;非托管是直接运行在操作系统上的。

对于 X# 来说,“对于 “正常的” 托管代码,你实际上只需要处理两种调用约定:1. 对于未类型方法,编译器使用 CLIPPER 调用约定;2.对于类型化方法,编译器在 STRICT 和 PASCAL 之间没有区别。它们都产生相同的代码”

好吧,至少我要理解什么是 Clipper 调用约定,什么是 Strict 调用约定,什么是 Pascal 调用约定。

按照《第二章 X# 的历史渊源及其理念》的内容和 X# 中文档的说明,Clipper 调用约定“是 Xbase 世界中的一种特殊调用约定,在 Xbase 世界中,函数的参数(从技术上讲)都是可选的,而且可以传递比声明参数更多的值。”。至于这个名称的由来,我猜测大概是由此而来:1985 年“Nantucket 发布第一款 dBase 编译器 Clipper 1.0”。

VFP 是 Xbase 世界的一员,因此,按照概念描述和在 VFP 中的经验,所有和 VFP 语法一致的函数/方法都使用的是 Clipper 调用约定,就像下面的这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Function foo(a, b, c)
	* 一些逻辑代码
Endfunc

函数没有返回类型,参数也未指定类型。这符合 VFP9 帮助中对 Function 命令的第一种语法定义。

但是,其中还有另一种语法定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FUNCTION FunctionName( [ parameter1 [ AS para1type ][ ,parameter2 [ AS para2type ] ],...] ) [ AS returntype ]
      Commands 
   [ RETURN [ eExpression ] ]
[ENDFUNC]

在 VFP 中,这种语法可能是为了使 VFP 看上去像是强类型语言,但是在 X# 中,按照官方文档的描述,这应该算是使用了 Strict 调用约定。因此,Clipper 调用约定和 Strict 调用约定的区别跃然纸上。

对于 Pascal 调用约定,X# 的官方文档是这样描述的:这种调用约定在 Pascal 的世界里被广泛使用。它看起来很像 STRICT 调用约定......在 C/C++ 中,这被称为 __stdcall 调用约定。Windows API 中的大多数函数都使用这种调用约定。

至此,对这个概念基本上是了解了。如果在构建项目时看到与此相关的错误信息,也知道该如何修改代码了:)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 xinjie的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
X#(XSharp)的重载
重载是 OOP 编译时的多态性。但是,VFP 虽然号称是面向对象的编程语言,却缺乏这一特性。VFP 的 OOP 仅仅实现了封装和继承。
firstxinjie
2025/01/07
720
X#(XSharp)的重载
XSharp(X#)的编译器选项(五)
Clipper Compatible intiger divisions(Clipper 兼容整数除法)
firstxinjie
2025/03/27
290
XSharp(X#)的编译器选项(五)
XSharp(X#)的编译器选项(一)
使用过 VFP 的几乎没考虑过“编译器选项”这个问题。我也同样如此。因此,当我第一次接触这个概念的时候是有瞬间的懵逼。《X# 中使用 VFP 方言常用的编译器选项》一文的原始内容,来自官方论坛中开发组人员的回帖。
firstxinjie
2025/03/20
620
XSharp(X#)的编译器选项(一)
X#(XSharp)中的 CursorAdapter
严格来说,X# 中的 CursorAdapter(CA)是不完整的。但是从应用的角度来说,X# 中的 CA 实现确实足够了。
firstxinjie
2025/02/04
680
X#(XSharp)中的 CursorAdapter
XSharp(X#)的编译器选项(二)
对于 VFP 来说,通常使用的是后期绑定,因此,在 X# 中,如果使用 Visual FoxPro 方言,此选项通常选择比不选择好。
firstxinjie
2025/03/21
730
XSharp(X#)的编译器选项(二)
X# 开发 Winform 项目在 gridView 中显示数据
笔者是一名使用 Visual FoxPro 开发近二十年的程序员,使用过从VFP5~VFP9 的所有版本,用她写过不多不少、大大小小、好好烂烂的程序。虽天资愚钝,对程序设计却满腔热血。一路有过拼搏,有过迷茫,有过软件项目交付成功的成就和喜悦,有过项目烂尾的无奈......
firstxinjie
2024/12/06
1210
X# 开发 Winform 项目在 gridView 中显示数据
第二章 X# 的历史渊源及其理念
如果你是 80 后,你就已经完全错过了“PC 数据库的黄金时代”,这可能始于Wayne Ratliff在帕萨迪纳 的喷气推进实验室 无聊的一天,帕萨迪纳是一个非常靠近洛杉矶的城市(我曾希望我也能在那里工作, 但至少我去过那里一次)。
firstxinjie
2024/12/06
1270
第二章 X# 的历史渊源及其理念
X# 点滴(一):注释和变量
在 X# 中仍然可以以这样的方式使用变量。前提:你需要在项目属性中明确启用以下两项:
firstxinjie
2024/12/06
660
X# 点滴(一):注释和变量
XSharp(X#)的编译器选项(三)
Enforce VIRTUAL/OVERRIDE(强制 VIRTUAL/OVERRIDE)
firstxinjie
2025/03/24
690
XSharp(X#)的编译器选项(三)
X# 点滴(六):Visual FoxPro 方言的“设置”
X# 看上去似乎不像 VFP 那样需要过多的 “Set”,但是,不表示你可以什么都不管。
firstxinjie
2024/12/06
770
X# 点滴(六):Visual FoxPro 方言的“设置”
调用约定
  调用约定指定函数调用方放置调用函数时所需参数的具体位置(如栈中、寄存器中),此外,还约定了再函数调用结束后由谁负责从栈中删除这些参数。在使用IDA的F5功能时经常能够看到函数签名中带有cdecl、fastcall等字样,这些就是调用约定。调用约定是通常是特定于语言、编译器和CPU的,这里只简单了解一下主流的调用约定。
大A
2023/02/14
8740
X# 点滴(三):最初体验
从前两篇的描述来看,X# 对于 VFP 程序员来说似乎是天然的亲近。下图展示了 VFP 和 X# 的“血缘关系”:
firstxinjie
2024/12/06
1070
X# 点滴(三):最初体验
X#(XSharp) 中的自定义类(1)
可能很多熟悉 .NET 的会笑我自不量力,但是,作为具有 VFP 技术背景的程序员,在使用 X# 时,自然而然的就会遇到同样的问题。
firstxinjie
2025/01/11
540
X#(XSharp) 中的自定义类(1)
2020-09-04:函数调用约定了解么?
不同点是stdcall在被调用函数 (Callee) 返回前,由被调用函数 (Callee) 调整堆栈。cdecl在被调用函数 (Callee) 返回后,由调用方 (Caller) 调整堆栈,每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。
福大大架构师每日一题
2020/09/04
6080
如何在 X# 中执行一个窗体(表单)
在简体中文世界,Form 在 VFP 中称为“表单”,在 .NET 世界,称为“窗体”。但是,无论称呼如何,都存在同样的问题,如何执行它。
firstxinjie
2024/12/27
790
如何在 X# 中执行一个窗体(表单)
RISC-V 函数调用约定和Stack使用
不同的处理器指令集不一样,而汇编语言中都是一条条指令,所以不同处理器对应的汇编语言必然不一样。
大忽悠爱学习
2023/10/11
1.1K0
RISC-V 函数调用约定和Stack使用
从零开始学习X#(三)
1. 使用任何您喜欢的编辑器(ahem, VI),然后使用命令行编译器进行编译。这是我留给读者自行探索的选项。
加菲猫的VFP
2021/08/16
1.4K0
关于函数参数入栈的思考(函数调用约定,入栈顺序)
首先,要实现函数调用,除了要知道函数的入口地址外,还要向函数传递合适的参数。向被调函数传递参数,可以有不同的方式实现。这些方式被称为“调用规范”或“调用约定”。C/C++中常见的调用规范有__cdecl、__stdcall、__fastcall和__thiscall。
恋喵大鲤鱼
2018/08/03
2.7K0
关于函数参数入栈的思考(函数调用约定,入栈顺序)
5.5 汇编语言:函数调用约定
函数是任何一门高级语言中必须要存在的,使用函数式编程可以让程序可读性更高,充分发挥了模块化设计思想的精髓,今天我将带大家一起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进行实现的,并使用汇编语言模拟实现函数编程中的参数传递调用规范等。
微软技术分享
2023/08/22
3430
函数调用约定
现代的几乎所有的编程语言都离不开函数和参数的概念。而这个概念是编程语言级别的,而不是硬件级别的。也就是说硬件上本来没有函数的概念。只是函数的用的太普遍,硬件开始为函数准备专用的指令。
战神伽罗
2019/08/13
2.3K0
相关推荐
X#(XSharp)的重载
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文