C++愤恨者札记3——函数调用约定
函数调用约定指的是,参数压栈顺序及弹栈位置的约定。这个约定在函数声明时指定,如:
void__stdcallFn(intarg1,intarg2);
其中__stdcall就是调用约定,表示参数从右至左入栈,而函数自己负责参数弹栈工作。
还有一种常用约定为__cdecl,表示参数从右至左入栈,而函数调用者负责参数弹栈工作。
如果没有指定调用约定,编译器会使用默认约定。VS中默认约定可以在工程属性中设置:
VC++中,一般函数使用__cdecl约定,但类成员函数,包括构造函数,使用__stdcall约定(我不知道为什么),从它们的反汇编代码中可以看出。
源码:
class Node
{
public:
Node(){}
void Fn( int a, int b ){}
};
void Fn(int a, int b)
{
}
void main()
{
Node n;
n.Fn(1, 2);
Fn( 1, 2);
}
main与Fn反汇编代码如下:
-------------------------------------------------------------------------------------------------------------------
函数调用约定在汇编中,区别是巨大的,而在高级语言里却很少进入视野。下面给出一个因约定不一致导致程序崩溃的例子。程序要在
debug版本下编译,或release版下把/Od打上,禁止优化,否则可能看不到程序崩溃。
typedef void (__cdecl *CDeclType)(void*);
void __stdcall Fn(void* p)
{
}
void MyCallBack( CDeclType pFn )
{
pFn(0); /*pFn的参数将会被两次弹栈,
破坏栈平衡MyCallBack将找不到返回地址*/
}
void main()
{
MyCallBack( (CDeclType)Fn );
}
分享到:
相关推荐
Visual C/C++的编译器提供了几种函数调用约定,了解这些函数调用约定的含义及它们之间的区别可以帮助我们更好地调试程序。在这篇文章里,我就和大家共同探讨一些关于函数调用约定的内容。 Visual C/C++的编译器支持...
C/C++函数调用约定的区别 函数参数入栈的方式顺序
本文主要探讨C/C++语言函数间参数的传值和传地址机制,同时探讨了计算机在调用一个函数时采用什么样的方法来自适应的处理函数中的参数,即函数调用约定.
C++中的类中函数调用,只是基于简单的函数调用的例子
函数调用方式决定了函数参数入栈的顺序,是由调用者函数还是被调用函数负责清除栈中的参数等问题,而函数名修饰规则决定了编译器使用何种名字修饰方式来区分不同的函数,如果函数之间的调用约定不匹配或者名字修饰不...
5、naked call采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存
C++自动生成函数调用关系图.rar
函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一个函数的调用的呢?参数入栈、函数跳转、保护现场、回复现场等又是怎样实现的呢?本文将对函数调用的过程进行深入的分析和详细解释,并在VC ...
为了验证C++类间函数的相互调用,利用VC6.0的对话框和任意一个逻辑类,实现了点击对话框按钮-〉调用逻辑类函数-〉在对话框显示运行结果的功能
本文给大家分享了避免析构函数调用虚函数。
C_C++语言硬件程序设计——基于TMS320C5000系列DSP
在 Linux 环境下,借助工具 Code Vize 可提取出开源软件中函数以及函数之间的依赖关系,并将分析结果以文本形式输出到文件中,然后借助于可视化工具 Graphviz 可将节点以及节点之间的依赖关系以图形化的方式 展示...
自动生成c++函数调用关系图,里面包含了所有要用到的软件,一站式服务; 通过本人亲测的使用总结; 还有使用到的配置文件(c++的),实在不会配置可以直接使用; 改一改配置文件,应该还可以生成c,java,c#语言的调用...
安卓Android源码——代码调用C++代码和C++代码调用代码.zip
C++ 获取函数调用堆栈的 高效实现代码
关于C和C++中函数的调用约定.doc 我自己整理的,大家可以看看
函数模板 建立一个通用的函数,函数类型和形参不具体指定,用一个虚拟的类型代表。 只要是函数体是相同的就可以用这个模板代替。 (只适用于函数的参数个数相同而类型不同,且函数体一致的情况,如果参数个数不同,则...
QML调用C++方法, C++调用QML,C++发送信号QML接收
但是当要进行查找、删除、修改操作时,系统只能对第一个对象进行操作 查看程序时,发现查找函数、删除和修改函数都有个逻辑错误 C++课程设计-单链表——学生信息管理系统全文共9页,当前为第6页。全部修改后,程序...