问一下VC的一些关键字

hzqq 2004-12-04 08:51:32
本人初学vc
好多关键字令人费解,忘高手指点
afx到底是什么意思?
afx_msg是什么意思?
它的定义更加搞笑,就是什么都没有?
#ifndef afx_msg
#define afx_msg
#endif
还有_stdcall是什么意思?
PASCAL是什么意思?
还有很多,我一时列举不出来,望大家补充,也给我们菜鸟学习学习
...全文
138 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
uoyevoli 2004-12-05
  • 打赏
  • 举报
回复
呵呵,AFX从本质上说,它是MS当初开发MFC的那个小组的名字。
那个小组叫“Application Framework ......”小组。这就是“AF”的来源。至于X嘛,只是一个响亮的后缀,凑足三个字母好听一些罢了。

它们用这个前缀来命名所有MFC中的全局的东西。只是为了更好记忆,避免重名。

看看侯捷的 深入浅出MFC 一书。
hzqq 2004-12-04
  • 打赏
  • 举报
回复
谢谢大家,我是学过C和C++的,但是书上从来没
提到过这些关键字,所以我想这个是VC新增加出来的东西吧

_cdecl
这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。
这个不定参数功能如何实现?
能不能给个例子?
HunterForPig 2004-12-04
  • 打赏
  • 举报
回复
取经来了 !
oyljerry 2004-12-04
  • 打赏
  • 举报
回复
_stdcall等定义了函数调用约定
oyljerry 2004-12-04
  • 打赏
  • 举报
回复
afx_msg 暂时没有,可能为了后面的版本的兼容
uglystone 2004-12-04
  • 打赏
  • 举报
回复
上面说的比较好
qrlvls 2004-12-04
  • 打赏
  • 举报
回复
回去再补一补C和C++的其础知实,这些基础在将来会使你受益无穷
hongzm 2004-12-04
  • 打赏
  • 举报
回复
深入浅出MFC有上面的答案。~
Kudeet 2004-12-04
  • 打赏
  • 举报
回复
__cdecl,__fastcall, __stdcall 什么区别?请祥细点。
---------------------------------------------------------------

函数参数入栈的方式
---------------------------------------------------------------

在函数调用过程中,会使用堆栈,这三个表示不同的堆栈调用方式和释放方式。
比如说__cdecl,它是标准的c方法的堆栈调用方式,就是在函数调用时的参数压入堆栈是与函数的声明顺序相反的,其它两个可以看MSDN,不过这个对我们编程没有太大的作用
---------------------------------------------------------------

调用约定

调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。MFC支持以下调用约定:

_cdecl

按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。

如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ。

这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。

_stdcall

按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。

所有的Win32 API函数都遵循该约定。


_fastcall

头两个DWORD类型或者占更少字节的参数被放入ECX和EDX寄存器,其他剩下的参数按从右到左的顺序压入栈。由被调用者把参数弹出栈,对于“C”函数或者变量,修饰名以“@”为前缀,然后是函数名,接着是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是@func@12。对于“C++”函数,有所不同。

未来的编译器可能使用不同的寄存器来存放参数。


thiscall

仅仅应用于“C++”成员函数。this指针存放于CX寄存器,参数从右到左压栈。thiscall不是关键词,因此不能被程序员指定。


naked call

采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。

naked call不是类型修饰符,故必须和_declspec共同使用,如下:

__declspec( naked ) int func( formal_parameters )

{

// Function body

}


过时的调用约定

原来的一些调用约定可以不再使用。它们被定义成调用约定_stdcall或者_cdecl。例如:

#define CALLBACK __stdcall

#define WINAPI __stdcall

#define WINAPIV __cdecl

#define APIENTRY WINAPI

#define APIPRIVATE __stdcall

#define PASCAL __stdcall
pleasehelpme 2004-12-04
  • 打赏
  • 举报
回复
学习
popxiaozhi 2004-12-04
  • 打赏
  • 举报
回复
_stdcall表示函数的调用规则,有几种情况,一种函数的参数从右往左压栈,调用函数清理栈;另一种是被调用函数自己清理栈
pleasehelpme 2004-12-04
  • 打赏
  • 举报
回复
我认为:

初学的话,不用管它,否则会被弄得晕头转向(不好意思,其实我现在也不知道什么意思)

最好照书上编写几个简单程序,先建立感性认识。
  • 打赏
  • 举报
回复
PASCAL是什么意思? pascal
Pascal case

The first letter in the identifier and the first letter of each subsequent concatenated word are capitalized. You can use Pascal case for identifiers of three or more characters.


afx_msg消息比如ON_WM_LBUTTONDOWN
I_Love_CPP 2004-12-04
  • 打赏
  • 举报
回复

1.afx开头的表示MFC全局变量/全局函数。

2.这个根本不搞笑,这是避免重复定义:
#ifndef afx_msg //如果没有定义afx_msg
#define afx_msg //才定义afx_msg
#endif

3.
Microsoft Specific

The __pascal, __fortran, and __syscall calling conventions are no longer supported. You can emulate their functionality by using one of the supported calling conventions and appropriate linker options.

WINDOWS.H now supports the WINAPI macro, which translates to the appropriate calling convention for the target. Use WINAPI where you previously used PASCAL or __far __pascal.



16,472

社区成员

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

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

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