问一下VC的一些关键字
本人初学vc
好多关键字令人费解,忘高手指点
afx到底是什么意思?
afx_msg是什么意思?
它的定义更加搞笑,就是什么都没有?
#ifndef afx_msg
#define afx_msg
#endif
还有_stdcall是什么意思?
PASCAL是什么意思?
还有很多,我一时列举不出来,望大家补充,也给我们菜鸟学习学习
问题点数:60、回复次数:14Top
1 楼I_Love_CPP(Never stop!)回复于 2004-12-04 21:04:08 得分 10
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.
Top
2 楼liuxiaoyi666(MSMVP 小猪妹荣誉马甲之八卦兔子)回复于 2004-12-04 21:06:16 得分 10
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_LBUTTONDOWNTop
3 楼pleasehelpme(革命尚未成功,同志仍需努力)回复于 2004-12-04 21:08:24 得分 0
我认为:
初学的话,不用管它,否则会被弄得晕头转向(不好意思,其实我现在也不知道什么意思)
最好照书上编写几个简单程序,先建立感性认识。Top
4 楼popxiaozhi(popxiaozhi)回复于 2004-12-04 21:09:23 得分 10
_stdcall表示函数的调用规则,有几种情况,一种函数的参数从右往左压栈,调用函数清理栈;另一种是被调用函数自己清理栈Top
5 楼pleasehelpme(革命尚未成功,同志仍需努力)回复于 2004-12-04 21:10:16 得分 0
学习Top
6 楼laiyiling(陌生人[MVP])回复于 2004-12-04 21:13:47 得分 20
__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 __stdcallTop
7 楼hongzm(西门吹牛)回复于 2004-12-04 21:31:48 得分 0
深入浅出MFC有上面的答案。~Top
8 楼qrlvls( 空 气 )回复于 2004-12-04 21:34:18 得分 0
回去再补一补C和C++的其础知实,这些基础在将来会使你受益无穷Top
9 楼uglystone(丑石)回复于 2004-12-04 21:34:36 得分 0
上面说的比较好
Top
10 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-04 21:35:24 得分 0
afx_msg 暂时没有,可能为了后面的版本的兼容Top
11 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-04 21:37:13 得分 0
_stdcall等定义了函数调用约定Top
12 楼HunterForPig(留着口水的猪)回复于 2004-12-04 21:43:46 得分 0
取经来了 !Top
13 楼hzqq(丁丁)回复于 2004-12-04 22:41:01 得分 0
谢谢大家,我是学过C和C++的,但是书上从来没
提到过这些关键字,所以我想这个是VC新增加出来的东西吧
_cdecl
这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。
这个不定参数功能如何实现?
能不能给个例子?Top
14 楼uoyevoli(爱什么呢?www.FARPROC.com)回复于 2004-12-05 16:04:35 得分 10
呵呵,AFX从本质上说,它是MS当初开发MFC的那个小组的名字。
那个小组叫“Application Framework ......”小组。这就是“AF”的来源。至于X嘛,只是一个响亮的后缀,凑足三个字母好听一些罢了。
它们用这个前缀来命名所有MFC中的全局的东西。只是为了更好记忆,避免重名。
看看侯捷的 深入浅出MFC 一书。Top




