__declspec,__cdecl,__stdcall都是什么意思?有什么作用?

__cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要注意了,只有用相同的方法才能够调用成功.另外,像printf这样接受可变个数参数的函数只有用cdecl才能够实现.   
  __declspec主要是用于说明DLL的引出函数的,在某些情况下用__declspec(dllexport)在DLL中生命引出函数,比用传统的DEF文件方便一些.在普通程序中也可以用__declspec(dllimport)说明函数是位于另一个DLL中的导出函数. 

int   WINAPI   MessageBoxA(HWND,LPCSTR,LPSTR,UINT);   
  而WINAPI实际上就是__stdcall.   
  大多数API都采用__stdcall调用规范,这是因为几乎所有的语言都支持__stdcall调用.相比之下,__cdecl只有在C语言中才能用.但是__cdecl调用有一个特点,就是能够实现可变参数的函数调用,比如printf,这用__stdcall调用是不可能的.   
  __fastcall这种调用规范比较少见,但是在Borland   C++   Builder中比较多的采用了这种调用方式.   
  如果有共享代码的需要,比如写DLL,推荐的方法是用__stdcall调用,因为这样适用范围最广.如果是C++语言写的代码供Delphi这样的语言调用就必须声明为__stdcall,因为Pascal不支持cdecl调用(或许Delphi的最新版本能够支持也说不定,这个我不太清楚).在其他一些地方,比如写COM组件,几乎都用的是stdcall调用.在VC或Delphi或C++Builder里面都可以从项目设置中更改默认的函数调用规范,当然你也可以在函数声明的时候加入__stdcall,__cdecl,__fastcall关键字来明确的指示本函数用哪种调用规范.   
  __declspec一般都是用来声明DLL中的导出函数.这个关键字也有一些其他的用法,不过非常罕见.

时间: 2024-11-05 17:29:39

__declspec,__cdecl,__stdcall都是什么意思?有什么作用?的相关文章

ssh框架-SSH框架里这些包分别都代表什么?各自的作用是什么?

问题描述 SSH框架里这些包分别都代表什么?各自的作用是什么? 解决方案 这说作用吧 貌似没有 只是编程人员一种习惯而已 action一般作为控制层 service一般是做业务逻辑处理 dao一般作为与数据库打交道的一层 解决方案二: 这个包名是个人习惯写的,不固定标准写什么包,ssh分别是struts2,spring和hibernate.action一般写的struts2的控制层.dao一般写接口.daoImpl一般写接口实现类,model是模型的意思. 解决方案三: 这和ssh无关,只是一种

__cdecl __stdcall 解析

1.如果函数func是__cdecl(默认调用方式),调用时情况如下  int    main()    {    //参数从右到左压栈     push   4     push   3     push   2     push   1     call    func     add    esp   0x10   //调用者恢复堆栈指针esp,4个参数的大小是0x10(4x4)     }    2.如果函数func是__stdcall,调用时情况如下  int    main()   

__stdcall,__cdecl,_cdecl,_stdcall,。__fastcall,_fastcall 区别简介

1.  今天写线程函数时,发现msdn中对ThreadProc的定义有要求:DWORD WINAPI ThreadProc(LPVOID lpParameter);  不解为什么要用WINAPI宏定义,查了后发现下面的定义.于是乎需要区别__stdcall和__cdecl两者的区别: #define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define

带你玩转Visual Studio——调用约定__cdecl、__stdcall和__fastcall

有一定C++开发经验的人一定对"__cdecl.__stdcall.__fastcall"肯定不陌生吧!但你真正理解了吗?是的,我曾在这采了无数个坑,栽了无数个跟头,终于忍无可忍要把它总结一下(虽然我已经有能力解决大部分这种问题了)! 什么是调用约定 函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的.它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出栈,(3)以及产生函数修饰名的方法. 我们知道函数由以

__declspec《转》

2008-09-16 14:54 1049人阅读 评论(1) 收藏 举报 __cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要注意了,只有用相同的方法才能够调用成功.另外,像printf这样接受可变个数参数的函数只有用cdecl才能够实现.   __declspec主要是用于说明DLL的引出函数的,在某些情况下用__declspec(dllexpor

c++ 中__declspec 的用法详解_C 语言

c++ 中__declspec 的用法如下,想要了解的继续往下看吧. 语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值. e.g __declspec(align(32)) struct Str1{ int a, b, c, d, e; }; 它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最

__declspec(dllimport)的作用

是时候总结一下__declspec(dllimport)的作用了.可能有人会问:__declspec(dllimport)和__declspec(dllexport)是一对的,在动态链接库中__declspec(dllexport)管导出,__declspec(dllimport)管导出,就像一个国家一样,有出口也有进口,有什么难理解的呢?这是一种很自然的思路,开始我也是这样理解. 但是在两年前的一个项目中,我发现不用__declspec(dllimport)似乎也可以.比如现在我新建一个使用共

一个实例告诉你:Kaggle 数据竞赛都有哪些套路

前面写了很多篇理论,大家愿意一篇一篇坚持看下来其实挺不容易的,虽然理论很重要,但脱离了实践还是空中楼阁啊,算法科学家也不可能不代码啊,所以呀,今天我们就插播一期实践,和大家聊一聊实际过程当中机器学习算法的应用. 对于我们这些初学者或者说外行来说,因为我们没机会接触到机器学习真正的应用项目,所以一些比赛平台往往是我们不错的选择,比如说这个Kaggle啊,前一段时间被Google收购还挺火的,还有国内的天池啊,DataFountain啊,上面都有不少比赛可以选择,但是入门嘛,我们就从最简单的开始,就

喧嚣之后,BAT都在车联网领域落下了哪些棋子?

车联网 BAT已经不是十年前的BAT,小池塘俨然无法满足巨头的胃口,在PC.移动互联网已经天下三分的局面下,正在快速成长的车联网以其数千亿级的规模和互联网的特性理所当然的成为巨头们餐盘中新的一轮饕餮盛宴. 虽然有着互联网的某些特性,但与PC.移动互联网不同,车联网是一个全新的品类,生态更为复杂,其中传统车企掌握着极强的话语权,而且面临着交通法规.政策变化等不确定的政策风险,再加上车联网在国际上也没有先进成功的经验可供借鉴.软硬件标准不统一等因素的存在使得BAT在车联网的行进道路上显得异常踟蹰.