什么是PASCAL调用惯例 一个新手的问题

lingdang 2000-03-12 03:26:00
加精
传统编C++程序会用一条
int PASCAL WinMain (HINSTANCE hinstCur.......)
{
书上说:"这是PASCAL调用惯例,与C的调用的不同,PASCAL调用惯例在传送参数时
是由左向右依次置入堆战,,堆占的指针的还原可由被 调用的程序本身来负责
,若用C的调用惯例,则调用越多,程序码就越长,执行效率就越差."
我对书上解是的是懂非懂,为什么就用C调用惯例,调用越多,程序代码就越长呢???
(我是新手,麻烦您老人家告诉我的时候说的尽量详细一点,拜托了)
...全文
425 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cisco 2000-03-12
  • 打赏
  • 举报
回复
PASCAL调用是在在16位环境下支持的,PASCAL/FORTRAN命名规范是将名字转换成大写;函数调用规范是函数参数从左至右入栈,调用返回时堆栈的清除工作由被调用函数完成。在32位VC++环境下支持三种调用规范:C (_cdecl), standard (_stdcall), 及 fastcall (_fastcall),编译器不在支持PASCAL调用规范。在你以前使用 PASCAL 或 __far __pascal的地方使用宏WINAPI代替。
下面对这三种调用规范作一下对比:
-----------------------------------------------------------------------
_cdecl:
函数参数:从右至左入栈
堆栈清除:调用函数
命名规范:名字前加下划线"_"
------------------------------------------------------------------------
_stdcall:
函数参数:从右至左入栈
堆栈清除:调用函数
命名规范:名字前加下划线"_",后加"@"及参数所占的字节数
------------------------------------------------------------------------
_fastcall:
函数参数:前两个小于等于4字节的参数进寄存器,其余参数从右至左入栈
堆栈清除:调用函数
命名规范:名字前加"@",后加"@"及参数所占的字节数
------------------------------------------------------------------------

_cdecl比_stdcall及_fastcall调用生成的可执行文件的代码量要大,因为_cdecl调用时
需要每个调用函数包含被调用函数的堆栈清除代码。
kxy 2000-03-12
  • 打赏
  • 举报
回复
调用一个函数时,参数的传递是由堆栈来完成的,PASCAL的惯例是参数从左向右压入
堆栈,堆占的指针的还原可由被掉用的程序本身来负责,这样还原堆栈指针的代码
在被调用的函数中,此代码(还原指针)只有一份。
C的惯例是参数入栈是从右向左,堆占的指针的还原可由调用的程序本身来负责,
每调用一次,就生成一份堆占的指针的还原的代码,所以调用越多,程序代码就越长。
这里的代码是指编译连接后的机器代码。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧