CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

问一下VC的一些关键字

楼主hzqq(丁丁)2004-12-04 20:51:32 在 VC/MFC / 基础类 提问

本人初学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

相关问题

  • 关键字问题
  • 问 extern 关键字
  • ★☆★☆ 再问一个问题: 怎样高亮显示VC中的关键字?
  • 请问哪位做过像VC开发环境那样的关键字识别?
  • 关键字的问题!
  • native关键字的问题
  • 关键字输入问题
  • 关键字out的问题
  • sql server中的主关键字和外关键字的问题!
  • New关键字与virtual和override关键字的疑问。

关键词

  • c++
  • 函数
  • pascal
  • 代码
  • vc
  • mfc
  • 调用
  • 参数
  • 寄存器
  • 入栈

得分解答快速导航

  • 帖主:hzqq
  • I_Love_CPP
  • liuxiaoyi666
  • popxiaozhi
  • laiyiling
  • uoyevoli

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo