?@@@ MFC编程:请教:PASCAL这个是什么类型啊 @@@

xushengyong 2003-08-21 11:12:57
在很多书本中我都看见如下形式的函数说明:
static const AFX_MSGMAP* PASCAL _GetBaseMessageMap();

请问 PASCAL 到底是什么一种类型?他是不是一个“宏”,如果是,那他代表什么呢?

请高手们不吝赐教...谢谢!
...全文
73 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tonybaobao 2003-08-26
  • 打赏
  • 举报
回复
长见识了:)
xushengyong 2003-08-26
  • 打赏
  • 举报
回复
由於它是被Windows 系統所呼叫的(我們並沒有在應用程式任何㆞方呼叫此函式),所以這是㆒種call back 函式,意思是指在你的程式中,被Windows 系統呼叫的函式。這些函式雖然由你設計,但是永遠不會也不該被你呼叫,它們是為Windows 系統準備的
xushengyong 2003-08-26
  • 打赏
  • 举报
回复
在Win32 ㆗CALLBACK 被定義為__stdcall,是㆒種函式呼叫習慣,關係到
// 參數擠壓到堆疊的次序,以及處理堆疊的責任歸屬。其他的函式呼叫習慣還有__cdecl\__pascal
canoe_eyes 2003-08-22
  • 打赏
  • 举报
回复
指明参数的压栈处理方法
fengge8ylf 2003-08-22
  • 打赏
  • 举报
回复
学习
sunheroshang 2003-08-21
  • 打赏
  • 举报
回复
学习
zjxushengyong 2003-08-21
  • 打赏
  • 举报
回复
谢谢先!
另外我还想请教一下:
三种调用函数的方式主要区别在于参数的压栈顺序不同,那么其压栈方式的不用对程序的整体有什么影响呢?也就是说为什么有的地方用pascal方式,有的却用stdcall方式?

请那位知道的大侠赐教...鄙人没有装MSDN,如果你没有时间,可以把MSDN上的内容贴到上面,谢谢!
zjxushengyong 2003-08-21
  • 打赏
  • 举报
回复
在VC中如何调用ASM汇编代码:
http://dwbclz.myetang.com/articles/masmhelp/

完全使用汇编语言编写程序是不切实际的,也是根本没有必要的。大概只有两种情况需要用到汇编:要求很高的执行效率或者需要执行系统底层的功能。因此,我们在多数情况下还是要用高级语言的,只是在关键的部分使用汇编语言,这就要求我们必须知道如何将高级语言和汇编语言结合起来。如果使用内联汇编那就简单的多了,只要加入asm关键字就可以了。不过,有些指令是不被内联汇编所支持的,这就使得我们不得不编写真正的汇编程序文件。汇编语言和高级语言的命名规范是不太一样的,必须正确命名汇编文件里的标识符,这样才能够在高级语言中正常调用。下面简要介绍一些常见的命名原则:
为程序段命名
在C语言中,代码段都是以“_TEXT”作为段名的,数据段是用“_DATA”作为段名的。这条规则在Pascal中也是适用的。下面是一个例子:
_TEXT segment public use32 'CODE'

_TEXT ends

这段程序定义了一个代码段,use32告诉编译器生成32位代码。
为标识符命名
C语言在编译以后,为所有的标识符添加了一条下划线作为前缀。如果你想在汇编语言中引用在C程序中定义的变量或函数,就必须也加上一条下划线。如果你使用的是C++编译器,那么还要注意一点,你一定要使用C链接才能使标识符符合上述命名规范。下面就是一个例子:
//这是在C语言中的定义方法

extern "C"
{
int hello;
}


;;这是在汇编语言中进行引用

extrn _hello
;...其它的代码
;............
mov _hello, 0

函数调用
变量的命名还是比较简单的,为函数命名就要考虑更多的问题了。不仅仅是要添加下划线,还要考虑调用规范,有时甚至要弄清楚各个编译器的命名原则。下名列出一些常用的调用规范(这些规范只适用于C链接):
__cdecl
这种调用规范比较简单,只要在变量名前面加上下划线就可以了。而且,这种调用方式在任何编译器中都是相同的。详细规则如下:
参数从右向左入栈

由调用者管理参数出栈

添加下划线作为前缀

__stdcall
很多Windows API都是使用这种调用方式,它比较节省空间。
参数从右向左入栈

由被调用者负责参数出栈

添加下划线作为前缀,加@n作为后缀,其中“n”为参数的字节数。(如果使用C++Builder,则无需添加前后缀,直接使用)

__fastcall
这是利用寄存器传输参数的调用方式。
如果使用VC,那么前两个参数传给ECX和EDX寄存器,剩下的从右向左入栈;如果使用C++Builder,那么前三个双字依次通过EAX,EDX和ECX寄存器传送,其它的从右向左入栈。

由被调用者负责参数出栈

添加"@"作为前缀,加"@n"作为后缀,其中“n”为参数的字节数。(如果使用C++Builder,则无需添加后缀,只需“@”作为前缀)

__msfastcall
这是Inprise公司为了和微软的调用规范兼容而采用的一个特别的关键字。实际上,没有必要在VC中使用__fastcall,以我的个人经验,这种方式在VC中没有得到很好的优化,执行效率反而会降低。

在高级语言中使用MASM6.14
我们可以使用一些方便的办法来把汇编语言的编译器和高级语言的开发环境有效地结合起来,每次编译都使用命令行是不明智的。
在VC中的使用方法
VC提供了一些支持,可以自动的编译汇编文件,你可以按照以下步骤进行:
在菜单中选择“Project | Settings...”
选中指定的汇编文件(单击即可)
选中Custom Build页
在Commands中输入:
如果是DEBUG模式,则输入:
e:\masm32\bin\ml /c /coff /Zi /FoDEBUG\$(InputName).obj $(InputPath)

如果是RELEASE模式,则输入:
e:\masm32\bin\ml /c /coff /FoRELEASE\$(InputName).obj $(InputPath)

在Outputs中输入:
如果是DEBUG模式,则输入:
DEBUG\$(InputName).obj

如果是RELEASE模式,则输入:
RELEASE\$(InputName).obj

如果你的没有把masm安装在E盘,则要作相应的修改。
相应的参数还有必要再解释一下:
“/c”表示只编译不链接。“/coff”表示生成coff格式的目标文件,这是在 VC中使用的文件格式。“/Zi”表示需要产生符号信息,便于调试。
ayanamiwww 2003-08-21
  • 打赏
  • 举报
回复
其实就是压栈的方式不同,其它的详细说明,你可以看看msdn了。^_^
BSRONG 2003-08-21
  • 打赏
  • 举报
回复
#define CALLBACK PASCAL
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define PASCAL pascal
Pipi0714 2003-08-21
  • 打赏
  • 举报
回复
它是一种参数入栈的顺序与C语言的恰好相反
xushengyong 2003-08-21
  • 打赏
  • 举报
回复
谁能具体说一下这三种方式的区别吗?谢谢...
lygfqy 2003-08-21
  • 打赏
  • 举报
回复
同意楼上的,_stdcall函数调用方式,主要是指明参数的压栈处理方法
ilbj 2003-08-21
  • 打赏
  • 举报
回复
PASCAL=WINAPI=stdcall
是一種函數調用方式
hyeena 2003-08-21
  • 打赏
  • 举报
回复
呵呵,来迟了,楼上的都说的很清楚了
xushengyong 2003-08-21
  • 打赏
  • 举报
回复
__cdecl,__stdcall,__fastcall的区别
__cdecl:
C/C++默认的调用规范,参数从右到左入栈,由调用者负责参数出栈,因此程序代码会比
__stdcall方式稍大

__stdcall:
win32 API函数使用这种调用方式,参数从右到左入栈,由被调用者负责参数出栈

__fastcall:
前两个参数传给ECX和EDX寄存器,剩下的从右向左入栈,由调用者负责参数出栈
FAICHEN 2003-08-21
  • 打赏
  • 举报
回复
调用约定相同就可以
zx_sanjin 2003-08-21
  • 打赏
  • 举报
回复
刚刚看的:)
http://sanjin.51.net/bbs/wdbread.php?forumid=5&filename=f_5
xushengyong 2003-08-21
  • 打赏
  • 举报
回复
大家再多贡献点哦...谈谈自己的看法...谢谢,学无止境啊,CSDN就是好,谢谢各位好心人...
jfzsl 2003-08-21
  • 打赏
  • 举报
回复
ok
加载更多回复(3)

16,472

社区成员

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

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

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