什么是FAR PASCAL?

时间:2010-05-05 14:38:06

标签: c++ c syntax

我想知道为什么在某些源代码中存在像FAR和PASCAL这样的宏。他们的意思和做法是什么? 感谢

7 个答案:

答案 0 :(得分:19)

  • PASCAL:它与calling convention有关。参数以从左到右的顺序(在cdecl的反面)推入堆栈,并且被调用者负责在返回之前平衡堆栈。

    此调用约定在以下16位API中很常见:OS / 2 1.x和Microsoft Windows 3.x.关于它是否被Borland Delphi 1.x

  • 使用,存在一些争议
  • FAR:在分段架构计算机中,far pointer是一个包含段选择器的指针,可以指向当前段之外的地址。

  

为了完整性,FAR和PASCAL是预处理器宏,当为16位系统编译时,会扩展为声明调用约定和指针大小所必需的关键字。在32位系统上,它们通常会扩展为空(除非你有一个奇怪的默认调用约定)。保留宏以实现向后兼容{hat / tip:来自Adrian McCarthy}

的评论

答案 1 :(得分:9)

在此处记忆,

当堆内存被分段时,FAR会回落到16位天。 NEAR数据的大小和速度有限,允许FAR更大但更昂贵。

据我所知,在32位的土地上,它是一个崩溃到没有的宏。

PASCAL是一种调用约定,在16位日内也大量使用。它已被stdcall取代。

两者都是为了向后兼容而留下的。

答案 2 :(得分:6)

FAR已经过时;它在16位代码中用于指示可以解决整个地址空间的指针,而不仅仅是当前段的16位偏移量。

PASCAL是一个召集会议。正如Wikipedia所描述的那样:

  

参数以从左到右的顺序(与cdecl相反)被压入堆栈,被调用者负责在返回之前平衡堆栈。

     

此调用约定在以下16位API中很常见:OS / 2 1.x,Microsoft Windows 3.x和Borland Delphi 1.x版。

答案 3 :(得分:3)

FAR是16位时代的延迟,当时我们有近(16位)和远(32位)指针。

PASCAL是一个调用约定。我相信它现在相当于stdcall

答案 4 :(得分:2)

这是一个旧的召集会议......

FAR继承自处理器寄存器太小而无法保存跳转目标的完整地址的时间。因此,处理器有两种类型的跳转,具体取决于目标与当前程序计数器的“距离”。

PASCAL描述了堆栈上的参数顺序,它告诉该函数使用Pascal编程语言描述的顺序,这与C语言不同(非常旧版本的操作系统,如使用Pascal开发的MacOS和Windows)。

答案 5 :(得分:1)

这可能是16位时代留下的一些冗余/过时的编码。

FAR用于16位应用程序,表明该地址需要超过16位。

PASCAL(altion)是一种转换类型,它允许编译器知道堆栈的排列方式(使用PASCAL调用约定),以便编译器可以将相应的参数传递给函数或从函数传递。

HTH

答案 6 :(得分:1)

具体来说,PASCAL说函数的参数是按从左到右的顺序传递的,这减少了代码的大小(因为调用者知道堆栈有多大,所以可以清理它)

C stdcall从右到左传递参数,这意味着您可以拥有可变数量的参数,但需要更多代码才能进行清理。