函数调用方法之__cdecl与_stdcall

  在debug VS c工程文件时,碰到cannot convert from ‘int (__cdecl *)(char *)‘ to ‘xxx‘这个问题,发现问题在于typedef函数指针类型时,将函数调用方法__cdecl写成了_stdcall。

后来百度了两者的区别,如下:

  __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。

  _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。

  把_stdcall改为__cdecl 问题解决。

原文地址:https://www.cnblogs.com/SuzanneHuang/p/9357250.html

时间: 2024-10-17 08:19:40

函数调用方法之__cdecl与_stdcall的相关文章

__cdecl、_stdcall、_fastcall、_thiscall

1. 介绍 __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误. _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针.这些堆栈中的参数由被调用的函数在返回后清除,

模式识别 - libsvm的函数调用方法 详解

libsvm的函数调用方法 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173 需要加载(load)SVM的模型, 然后将结点转换为SVM的格式, 即索引(index)+数据(value)的形式; 释放SVM的model有专用的函数: svm_free_and_destroy_model, 否则容易内存泄露; 可以预测数据的概率, 则需要模型是概率模型, 返回的是一个类别数组(2分类, 则为2个值的数组),

C#使用this关键字实现串联构造函数调用方法

本文实例讲述了C#使用this关键字实现串联构造函数调用方法.分享给大家供大家参考.具体分析如下: 在一个类中如果需要实现多个自定义构造函数,通常做法是在构造函数中实现各自的业务逻辑,如果这些业务逻辑的实现并非截然不同的话,显然不符合oop编程思想,极不利于维护,当然,我们也可以通过将相同的逻辑部分封装成一个方法,但还有一种更为合理简单的方法,下面就通过this关键字来实现串联构造函数做一简单示例. 示例代码如下: 代码如下: public class Person { public strin

switch,break和continue区别,函数调用方法,默认类型提升

1.switch语句的格式?针对格式的解释?以及注意事项?解:格式:switch(表达式){case 值1:语句1;break;case 值2:语句2;break;......case 值n-1:语句n-1;break;case 值n:语句n;break;default:语句n+1;break;格式解释:switch-选择结构语句,作用与if一样. case-其后的值与表达式进行比较,若符合表达式则执行. default-若上述条件都不成立,则执行default中的语句,作用同if语句中的els

__cdecl 与 _stdcall 的栈平衡

各类关于VC的书中都多少写到: 1._stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈. 2.__cdecl是C和C++程序的缺省调用方式.每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大.函数采用从右到左的压栈方式.注意:对于可变参数的成员函数,始终使用__cdecl的转换方式. __cdecl 说实在话,很多初学者对于这样的描述依然很不解,这两种调用方式究竟有什么区别呢? 我们先来看看以下代码: v

JAVA多态计算面积main函数调用方法

public static void main(String[] args) { Shape shape; Scanner input = new Scanner(System.in); System.out.println("请选择图形(1.圆形 2.矩形 3.三角形)"); int a = input.nextInt(); if(a == 1){ System.out.println("请输入圆形的边长:"); double r = input.nextDoub

C++语言学习(十二)——C++语言常见函数调用约定

C++语言学习(十二)--C++语言常见函数调用约定 一.C++语言函数调用约定简介 C /C++开发中,程序编译没有问题,但链接的时候报告函数不存在,或程序编译和链接都没有错误,但只要调用库中的函数就会出现堆栈异常等现象.上述现象出现在C和C++的代码混合使用的情况下或在C++程序中使用第三方库(非C++语言开发)的情况下,原因是函数调用约定(Calling Convention)和函数名修饰(Decorated Name)规则导致的.函数调用约定决定函数参数入栈的顺序,以及由调用者函数还是被

C/C++:函数调用规则__stdcall,__cdecl,__pascal,__fastcall

__cdecl __cdecl 是 C Declaration  的缩写,表示 C 语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误. __stdcall __stdcall 是 Standard Call 的缩写,是 C++ 的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是 this 指针.这些堆栈中的参数由被调用的

函数调用的几种方法 几种主流框架使用匿名函数模仿块级作用域的方式

函数调用的几种方法 js 里函数调用有4种模式:方法调用.正常函数调用.构造器函数调用.apply/call 调用.同时,无论哪种函数调用除了你声明时定义的形参外,还会自动添加2个形参,分别是 this 和 arguments.这里你既然问 this,那么就只谈 this.this 的值,在上面4中调用模式下,分别会绑定不同的值.分别来说一说:方法调用:这个很好理解,函数是一个对象的属性,比如 var a = { v : 0, f : function(xx) { this.v = xx; }